Objectを座標で動かす際、Z+に動かすとワールド座標でZ+に移動します。
ワールドでの移動はObjectのY軸に回転がかかっている状態でも動く方向は同じです。

それを例として、ObjectにY軸45度回転がかかっていたら
そのObjectnの正面である、ワールド座標でZとXの間を斜め移動するようにしたいです。


三角関数などを利用すればできると思うのですがどうすればできるのか分りません。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

オブジェクト座標系でZ+に動かしてから、新しい座標をワールド座標系に変換します。



具体的には、以下の処理をします。

1.オブジェクトを原点に平行移動する

2.オブジェクトから見た時の、移動量ベクトル行列を求める

3.オブジェクトが向いている方向の、方向ベクトルを求める

4.2と3を行列演算する

5.4で求めた行列を、1で平行移動したのと逆に平行移動する

最初の平行移動は、オブジェクトのワールド座標系での位置と同じなので、計算は要りません。

原点にあるオブジェクトがY軸に45度回転している時は

(x' y' z' 1) = { ( cos45 0 sin45 0 ) ( 0 1 0 0 ) ( -sin45 0 cos45 0 ) ( 0 0 0 1 ) } ( x y z 1 )

となります。

オブジェクトから見ての正面に10進んだ位置は、オブジェクトの現在位置を原点とした時

( 0 0 10 1 )

ですから、上記の式の「( x y z 1 )」に「( 0 0 10 1 )」を代入して

{ ( cos45 0 sin45 0 ) ( 0 1 0 0 ) ( -sin45 0 cos45 0 ) ( 0 0 0 1 ) } ( 0 0 10 1 )

を行列計算します。

そして、それをワールド座標系に平行移動します。

平行移動は

(x' y' z' 1) = { ( 0 0 0 tx ) ( 0 0 0 ty ) ( 0 0 0 tz ) ( 0 0 0 1 ) } ( x y z 1 )

で行列計算します。

この時のtx ty tzは「移動前のオブジェクトのワールド座標系での座標位置」で、「( x y z 1)」は、その前の行列計算で求めた「( x' y' z' 1)」の事です。

「何を言っているのか判らない」って場合は「行列」と「ベクトル」についての学習が必要です。
    • good
    • 0

このQ&Aに関連する人気のQ&A

計算 逆行列」に関するQ&A: 平面の計算方法

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

Q任意軸回転を、XYZ軸回転の組み合わせに分解する?

こんにちは、私は今DirectXを使って物理シミュレーションを行おうとしております。
そこで物体を任意軸回転させて表示したいのですが、どういった方法を用いれば実現できますか?
http://marupeke296.com/DXGSmp_No10_Quaternion.html
このサイトで解説されているようにクォータニオンを使うのでしょうか?
ただこのサイトで示されているサンプルでは、玉ひとつひとつが回転しているわけではなく、位置がある軸に関して回転させた位置へ「並進させる」ということを行っています。

私は物体を回転させるときに、任意軸回転を使いたいなと思っています。

--
D3DXMatrixRotationX(&Rot_X, angle);
D3DXMatrixMultiply(&World, &World, &Rot_X);
--

以上はX軸回転を行う行列をワールド座標変換行列に掛けるコマンドですが、この勢いで任意軸回転行列を作成・掛けるといったことはできますか?
知識が足りなく稚拙な表現で申し訳ありませんが・・・

任意軸回転をXYZ軸回転の組み合わせに分解できれば
D3DXMatrixRotationX(YやZ)とD3DXMatrixMultiply関数のみを使って簡単にできちゃうのですがそのような数学的手法は存在しますか?

それとも、任意軸回転関数を自前で既に作ってあるので
D3DXMATRIX型の変数にその値を手動で注入(構造体の中身を知る必要あり)、D3DXMatrixMultiply関数で掛けるといった操作でいけちゃうでしょうか?
あとでちょっとやってみます。すみません。しかしD3DX~系の用意された関数の域を出て気持ちよくはないですが。

こんにちは、私は今DirectXを使って物理シミュレーションを行おうとしております。
そこで物体を任意軸回転させて表示したいのですが、どういった方法を用いれば実現できますか?
http://marupeke296.com/DXGSmp_No10_Quaternion.html
このサイトで解説されているようにクォータニオンを使うのでしょうか?
ただこのサイトで示されているサンプルでは、玉ひとつひとつが回転しているわけではなく、位置がある軸に関して回転させた位置へ「並進させる」ということを行っています。

私は物体を回転させるときに、任...続きを読む

Aベストアンサー

D3DXMatrixRotationAxis で任意軸回転できるのでそれでどうでしょうか。

Qスクリーン座標からワールド座標への座標変換について

こんにちは。
現在自作で3Dゲームを制作しています。
ワールド座標からスクリーン座標への変換に成功したので
今度は逆にスクリーン座標からワールド座標への変換に挑戦していたのですが
どうにもうまくいかずに詰まってしまい、質問にきました。

ワールド→スクリーン変換にて得たスクリーン座標(sx, sy, sz)を使用して
スクリーン→ワールド変換を行うと成功するのですが
直接スクリーン→ワールド変換を行おうとすると失敗します。
というのも、直接スクリーン→ワールド変換時には sz にあたる値を
どうしたらいいものか・・・となってしまったからです。

今回、手計算(ヘルプ関数は使わず)で行っているのですが、計算していることは
ビューポート行列、プロジェクション行列、ビュー行列の逆行列を使用し
スクリーン座標(とりあえずszを0にして対応)に対して座標変換をおこなっています。
何か計算が足りていないのか、はたまた勘違いをしているのか・・・


詳しいご教授お願いいたします。


ワールド行列:単位行列
ビュー行列:視点と視線は動的に変動、上向き(0,1,0)
プロジェクション行列:視野角45度、アスペクト比 800/600
画面サイズ:800×600
テストに使用しているスクリーン座標:(200,300)

こんにちは。
現在自作で3Dゲームを制作しています。
ワールド座標からスクリーン座標への変換に成功したので
今度は逆にスクリーン座標からワールド座標への変換に挑戦していたのですが
どうにもうまくいかずに詰まってしまい、質問にきました。

ワールド→スクリーン変換にて得たスクリーン座標(sx, sy, sz)を使用して
スクリーン→ワールド変換を行うと成功するのですが
直接スクリーン→ワールド変換を行おうとすると失敗します。
というのも、直接スクリーン→ワールド変換時には sz にあたる値を
どうしたらい...続きを読む

Aベストアンサー

そもそもスクリーンに映っているのは奥行き情報が消えた「2D な絵」ですよね. だとしたら, 「視点から当該スクリーン座標に向かう (無限に長い) 視線」の上にある点はすべて「3D なワールド座標」の候補になってしまいます. そして, そのうちのどれが「正しいワールド座標」なのかをこれだけの情報から求めることは不可能です.

夜空に光る星までの距離を求めるには, 「ここで光ってる」という情報だけでは不足ですよね.

もちろん, スクリーンに映っている画像を作る元になった (ワールド座標における) オブジェクトの配置がすべてわかっているなら, 「視線の先にあるオブジェクト」を調べることはできます. もっと難しくして鏡面反射とか屈折とかを考慮すると, 結局レイトレになっちゃいますがここではそこまでの処理は不要でしょう.

Q任意軸回転行列の、回転量を少し減らしたいのですが…

皆様、いつもお世話になっております。
任意軸回転行列関係でひとつ疑問が出たので質問させていただきます。

3D物理シミュレータで物体の回転を扱うときに出た疑問です。
「アクセル」という行列に、単位行列を初めとして、さまざまな任意軸回転行列を、左から掛けていきます。
これが終わると「アクセル」はある回転行列になるはずです。
次に、問題があります。「ベロシティ」という行列に、「アクセル」という回転行列を、左からそのまま掛けるのではなく、回転量をちょっと少なくした、弱い回転を、しかしながら回転軸は同じものを、掛けたいのです。

--
・まず思いついた解決策:
回転角と回転軸を保持しておいて、ベロシティに「回転軸」と「デルタ×回転角」を掛ける、という方法。
=>しかしアクセルの時点で、行列を左から掛けていきたいので、この過程で回転角と回転軸を更新し続ける手法がわかりません。そもそも存在するのでしょうか。

・次に思いついた方法:
アクセルで左から任意軸回転行列をかけていった完成品は、これもまた任意軸回転行列のはずですから、この完成した行列から回転軸と回転角を逆算して、ベロシティに掛ける行列を「回転軸」と「デルタ×回転角」から再構成する、という方法。
=>任意軸回転行列から回転角と回転軸を逆算する方法がわかりません。

・次に思いついた方法:
任意軸回転行列から角度と軸を逆算しなくとも、任意軸回転行列に、何かしら手を加えると、回転角度に定数を掛け、回転量を調節することができる。
=>どんな方法があるのだろうか
--

これらの推測はしましたが、どれも解答にたどり着けませんでした。
どうかよろしくお願い致します。
不明な点がございましたら随時補足いたします。

皆様、いつもお世話になっております。
任意軸回転行列関係でひとつ疑問が出たので質問させていただきます。

3D物理シミュレータで物体の回転を扱うときに出た疑問です。
「アクセル」という行列に、単位行列を初めとして、さまざまな任意軸回転行列を、左から掛けていきます。
これが終わると「アクセル」はある回転行列になるはずです。
次に、問題があります。「ベロシティ」という行列に、「アクセル」という回転行列を、左からそのまま掛けるのではなく、回転量をちょっと少なくした、弱い回転を、しかし...続きを読む

Aベストアンサー

まず、行列は回転は表現できても、回転量は表現できません。

たとえば、x軸を中心に2π回転したことを表す行列というのは単位行列になります。

そこから回転量をちょっと少なくしても単位行列から変化しないことは理解できると思います。

つまり、必然的に回転量={回転軸+角度}という形で管理しなければならないということです。

回転軸+角度をを行列に反映する方法はわかると思います。

あとは回転量の合成ですが、それにはクォータニオンを利用します。

クォータニオンには下記の特徴があります。

・回転軸と角度からクォータニオンを作ることができる。
・クォータニオンから回転軸と角度を得ることができる。
・2つのクォータニオン同士の積は、2つの回転量を合成した回転量を表す。

上記を利用すると、回転量の合成が出来ることがわかると思います。

注意が必要なのは、クォータニオンも行列と同様に

ある軸を中心に2πの回転を表すクォータニオン == ある軸を中心に0の回転を表すクォータニオン

ということです。

これの対策としては、回転量の合成を行う前にスケーリングして正規化し、合成後の回転量に逆の変換を行うことで正しい結果を得ることが出来ます。

まず、行列は回転は表現できても、回転量は表現できません。

たとえば、x軸を中心に2π回転したことを表す行列というのは単位行列になります。

そこから回転量をちょっと少なくしても単位行列から変化しないことは理解できると思います。

つまり、必然的に回転量={回転軸+角度}という形で管理しなければならないということです。

回転軸+角度をを行列に反映する方法はわかると思います。

あとは回転量の合成ですが、それにはクォータニオンを利用します。

クォータニオンには下記の特徴があります。

・...続きを読む

QC言語 座標軸の設定

こんにちわ。私は最近プログラミングを学び始めた女学生です。
環境はVisual Studio 2008で、C++を使っています。
今回、課題として座標軸を-と|でつくり、その上にxの3乗-9xのグラフをあらわすというものが出ました。
おおよそわかったのですが、なぜかx軸を形成する軸(-)がこのプログラムだとひとつおきに表示されてしまい、軸として成立しません。なぜなのでしょうか。熟練者の方々、ご指導ご鞭撻のほど、よろしくお願いいたします。



#include<stdio.h>

main(void){
int a[40][60],x,y;

for(x=0;x<40;x++){
for(y=0;y<60;y++){
a[x][y]=0;
if (x==20){
printf ("-");}
else if (y==30) {
printf ("|");
}


if(y==(x-20)*(x-20)*(x-20)-9*(x-20)+30){
printf("*");
}
else
{printf(" ");
}
}
printf("\n");
}


}

こんにちわ。私は最近プログラミングを学び始めた女学生です。
環境はVisual Studio 2008で、C++を使っています。
今回、課題として座標軸を-と|でつくり、その上にxの3乗-9xのグラフをあらわすというものが出ました。
おおよそわかったのですが、なぜかx軸を形成する軸(-)がこのプログラムだとひとつおきに表示されてしまい、軸として成立しません。なぜなのでしょうか。熟練者の方々、ご指導ご鞭撻のほど、よろしくお願いいたします。



#include<stdio.h>

main(void){
int a[40][60],x,y;

for(x=0;x<40...続きを読む

Aベストアンサー

学生時代の私なら、「-」や「|」を表示させているif分のところを、

if (x == 20 && y == 30) {
printf("+");
continue;
} else if (x == 20){
printf ("-");
continue;
} else if (y == 30) {
printf ("|");
continue;
}

のようにしたと思います。

Q位置座標からx軸となす角度(ラジアンでも可)を求める方法

簡単な2次元座標系で現在の位置が(x,y)だとします。

この点を三角関数を用いて表したときに
x=m+r*cos a
y=n+r*sin a
となると思うんですが((m,n)は円の中心点,rは半径,aはx軸と半径のなす角とします)任意にa以外の変数に値を与えた場合,aを求めるプログラムの書き方が良く分かりません。

いいかえますと2点を結んだ直線とx軸とのなす角度を求めたいというものです。
もちろん角度ではなくラジアンでもかまいません。

どなたかご教授よろしくお願いします。

Aベストアンサー

三角関数の逆関数を使ってはどうでしょうか?
ある点の座標が(x,y)、x軸とのなす角をαとすると、

tan(α)=y/x

ですから、

α = atan(y/x)

となります。atan はアークタンジェントです。


このQ&Aを見た人がよく見るQ&A

このカテゴリの人気Q&Aランキング

おすすめ情報