C++(DirectX)でカメラ視点での平行移動プログラムを作成しています。
サイトのサンプルプログラムを参考に以下のように組んだみたのですがうまくいきません。
正面にいるときは問題なく動き、違う角度で試すと、正しい動きが行われない状態です。
どこが間違っているのでしょうか?
valueX,valueYはマウスの移動量です。
html
1 XMMATRIX mat = XMMatrixLookAtLH(XMLoadFloat3(&m_vPos), XMLoadFloat3(&m_vLook), XMLoadFloat3(&m_vUp)); 2 XMFLOAT4X4 mtx; 3 XMStoreFloat4x4(&mtx, XMMatrixLookAtLH(XMLoadFloat3(&m_vPos), XMLoadFloat3(&m_vLook), XMLoadFloat3(&m_vUp))); 4 XMFLOAT3 vecX = XMFLOAT3(mtx._11*valueX, mtx._12*valueX, mtx._13*valueX); 5 XMFLOAT3 vecY = XMFLOAT3(mtx._21*valueY, mtx._22*valueY, mtx._23*valueY); 6 m_vPan = XMFLOAT3(vecX.x + vecY.x, vecX.y + vecY.y, vecX.z + vecY.z); 7 m_vPos.x += m_vPan.x; 8 m_vPos.y += m_vPan.y; 9 m_vPos.z += m_vPan.z; 10 m_vLook.x += m_vPan.x; 11 m_vLook.y += m_vPan.y; 12 m_vLook.z += m_vPan.z; 13
誰かに質問するときには,相手が答えやすいようにあなたが持っている情報をもっと提示した方が良いのではないでしょうか.
例えば,所望の動作をしないコードを示す場合,そのコードの各所でどんな処理(演算)を行おうとしているのか,という意図を注釈なりで示した方が良いのではないでしょうか.
あと,
> 正面にいるときは問題なく動き…
みたいな,主語等が省略された文章では意味がうまく伝わらない可能性があります.
「AがBの正面にいるとき」という話をするとき,AやBを明記した方が誤解なく伝わるでしょう.
> カメラ視点での平行移動
というのも同様. 誰/何が 平行移動するのか?
> 正しい動きが行われない状態です。
これも.どういう動きになってるのか? というのを具体的に述べるべきでしょう.
改めて自分の質問を見て、非常に状況が分かりにくいと気づきました。
指摘していただきありがとうございます。
自分が行いたい処理はカメラ視点でカメラが平行移動するというプログラムです。
XMStoreFloat4x4(&mtx, XMMatrixLookAtLH(XMLoadFloat3(&m_vPos), XMLoadFloat3(&m_vLook), XMLoadFloat3(&m_vUp)));
の部分ではカメラの回転行列(4*4行列)を取得し、その後行列の各行にマウスの移動量をかけ、その値をカメラ座標とカメラ注視点に足しているという処理になっています。
カメラの初期座標は(0,0,5)で注視点は(0,0,0)になっているのですが、この初期座標付近では自分が求めているカメラの平行移動ができています。
ですが、カメラ座標が(5,0,0)や(-5,0,0)等初期座標から見て右側や左側では平行移動ではなくズームのような動きだったり、平行移動っぽいけど移動する方向が逆だったりと位置によって処理が変わっているような感じがあります。
状況が分かりにくい質問をしてしまいすいませんでした。
今後気を付けたいと思います。
vecX, vecY を算出する際に参照している mtx の要素の場所はそれで合っているのでしょうか?
XMMatrixLookAtLHによってつくられる行列の要素値がわかる(手計算できる)ような
{m_vPos, m_vLook, m_vUp}から出発して,
参照している mtx の要素が本当にカメラ座標系の基底ベクトルになっているのか? というのをチェックしてみてはどうでしょう.
(行と列を取り違えているだとかそういう話ではないのか否か)
> 状況が分かりにくい質問をしてしまいすいませんでした。
迷惑だ とか けしからん とかそういう方向のことを言っているわけじゃないので,謝るところではないです.
単に,「読み手が状況を把握し難い状況だと回答も付きにくいだろうから,あなたにとって損なのでは?」と言っているだけなので.
(例えば,起こってる現象が明確に書かれていれば,この手の処理をDirectXでやったことがあってそういう経験をした人がそれを見れば即答できるのかもしれないですし.)
行列部分が間違っていたみたいです。無事平行移動させることができました。
何度も対応していただきありがとうございました。
回答1件
あなたの回答
tips
プレビュー