プロが教えるわが家の防犯対策術!

Cまたは、C++で、3次元空間における
(x,y,z)成分4点で出来ている四角形を任意に入力して、
XY平面と平行になるように回転したのちに平行移動をする行列を使ったプログラムを作りたいのですが、行列の計算がうまくいきません。
知識不足なのは自覚しています。。。
ソースを比較して勉強したいと思っています。よろしくお願いします。

A 回答 (7件)

z軸まわりの回転行列


cosθ -sinθ 0
sinθ cosθ 0
0 0 1

x軸まわりの回転行列
1 0 0
0 cosθ -sinθ
0 sinθ cosθ

y軸まわりの回転行列
cosθ 0 sinθ
0 1 0
-sinθ 0 cosθ

任意軸まわりの回転行列もあるけど複雑すぎて掲載不可能ww

行列は全て, 後ろからベクトルをかける場合の形です.

http://www.amazon.co.jp/gp/product/4939007375/re …

この本がわかりやすい.立ち読みしれみれば?
    • good
    • 0

下の回答(#5)にゴミが入りこんでしまいました。

5行目は
(法線ベクトルを(X,Y,Z)とすると、X=(z1*y2+z2*y3+z3*y1)-(y1*z2+y2*z3+y3*z1)、
です。すみません。
    • good
    • 0

プログラムを作ってみました。

動作も確認できたのですが、回答の文字数制限(半角1600字)を超えてしまいましたので掲載できません。
採用した手法は以下の通りです
(x1,y1,z1),(x2,y2,z2),(x3,y3,z3)の3点を使う
3点で決まる平面の法線ベクトルを求める
(法線ベクトルを(X,Y,Z)とすると、X=(z1*y2+z2*y3+z3*y1)-(y1*z2+y2*z3+9-y3*z1)、
y成分,z成分についてもこの式の変数を循環させれば求まる)
法線ベクトルを、x成分が0になるように、z軸の回りに回転する
(回転の角度は atan2(X,Y)、この回転の後の法線ベクトルを(0,Y1,Z1)とする)
法線ベクトルを、y成分が0になるように、x軸の回りに回転する
(回転の角度は atan2(Y1,Z1))
(図形を任意の向きに向けるために)任意の角度だけz軸の回りに回転する
これらの回転で使った変換行列を元の3点に順番に掛ければ、元の3点のz座標は等しくなる(平面はXY平面と平行になる)

もっと良い方法があるかもしれませんが、ご参考までに。
    • good
    • 0
この回答へのお礼

ご丁寧にありがとうございました。
やり方がわかった分進めることが出来ました。
プログラム、是非比較して見てみたいのですが。。。
仕方ないですよね;


また、質問するかもしれませんがほんとにありがとうございました。
答えてくださったみなさんも、至らない点が多々ありましたが
つきあってくださってありがとうございました。

お礼日時:2009/12/02 03:55

>XY平面と平行になる


>(x,y,z)成分4点で出来ている四角形
四角形ポリゴンと言うことでしょうか?

>回転の中心は四角形の中心です
XY平面と平行になるということは3次元空間のお話ですから(2次元なら常にXY平面と平行のはず)回転の中心は点ではなく軸(線)になります。
Z軸を中心に回転させてもXY平面と平行になることはありませんから、X軸回転かY軸回転と言うことでしょうか? 

何がわからないのかよくわからないので上手く回答できませんが、

・行列の確保
 3次元の変換行列は4行4列になります。4×4の2次元配列を確保すればよいのではないでしょうか。
 (例) float Martix[4][4];

・行列の計算
 筆算で行列の計算はできますか?もしできるのであれば、プログラムは簡単だと思います。できないのであれば、「行列」でググっていただければよいサイトを沢山見つけることができます。

・変換行列の作り方
 「変換行列」 「3次元」 でぐぐれば、よいサイトを沢山見つけることができます。
 ただし、x,y,zの座標を縦ベクトルで管理するか、横ベクトルで管理するかで、行列の内容や掛ける順序が変わってきますので注意してください。
    • good
    • 0

「回転」の中心はどこ?


ちなみにだけど, 「行列のメモリが確保できていない」というならその先に進んでも無意味だと思うし, 「C++ は初めて」といってるならわざわざ C++ を使わずとも C でいいのでは?

この回答への補足

なので、現在Cでやっています。
回転の中心は四角形の中心です。
お手数ですが、よろしくお願いします。

補足日時:2009/12/01 15:58
    • good
    • 0

そもそも


> 3次元空間における
>(x,y,z)成分4点で出来ている四角形を任意に入力して
この時点で入力されたのは四角形ではなく、四面体です。
# 四角形になるのは特殊な場合。
なので一般に「XY平面と平行になる」パターンが4つできてしまいます。

> 行列の、sinやcosを使った掛け算の
> ソースの例をあげてもらえると助かります。

行列の掛け算ルーチンさえできてしまえば、各要素が何であろうが関係ないのでは?

この回答への補足

言い方が足りなくてすいませんでした。
任意でも、平らになる四角形です。
掛け算はやり直しているので大丈夫です。


何度もすいませんが、自動で「XY平面と平行になる」
回転行列がわからないのでそこの部分だけでも教えてください。

補足日時:2009/12/01 07:38
    • good
    • 0

なにが/どのようにうまくいかないかわからんと答えようがありません。

この回答への補足

行列のメモリが確保できていない状態だと思うのですが。。。
C++で書くのがはじめてなので勝手が違ってわかりません。
図々しいのは承知ですが、
行列の、sinやcosを使った掛け算の
ソースの例をあげてもらえると助かります。
お願いします。

補足日時:2009/12/01 05:39
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!