質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

2498閲覧

カメラ視点での平行移動

nonnon7

総合スコア2

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/09/02 10:10

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2021/09/03 01:24

誰かに質問するときには,相手が答えやすいようにあなたが持っている情報をもっと提示した方が良いのではないでしょうか. 例えば,所望の動作をしないコードを示す場合,そのコードの各所でどんな処理(演算)を行おうとしているのか,という意図を注釈なりで示した方が良いのではないでしょうか. あと, > 正面にいるときは問題なく動き… みたいな,主語等が省略された文章では意味がうまく伝わらない可能性があります. 「AがBの正面にいるとき」という話をするとき,AやBを明記した方が誤解なく伝わるでしょう. > カメラ視点での平行移動 というのも同様. 誰/何が 平行移動するのか? > 正しい動きが行われない状態です。 これも.どういう動きになってるのか? というのを具体的に述べるべきでしょう.
nonnon7

2021/09/03 03:19 編集

改めて自分の質問を見て、非常に状況が分かりにくいと気づきました。 指摘していただきありがとうございます。 自分が行いたい処理はカメラ視点でカメラが平行移動するというプログラムです。 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)等初期座標から見て右側や左側では平行移動ではなくズームのような動きだったり、平行移動っぽいけど移動する方向が逆だったりと位置によって処理が変わっているような感じがあります。 状況が分かりにくい質問をしてしまいすいませんでした。 今後気を付けたいと思います。
fana

2021/09/03 04:13

vecX, vecY を算出する際に参照している mtx の要素の場所はそれで合っているのでしょうか? XMMatrixLookAtLHによってつくられる行列の要素値がわかる(手計算できる)ような {m_vPos, m_vLook, m_vUp}から出発して, 参照している mtx の要素が本当にカメラ座標系の基底ベクトルになっているのか? というのをチェックしてみてはどうでしょう. (行と列を取り違えているだとかそういう話ではないのか否か)
fana

2021/09/03 04:18

> 状況が分かりにくい質問をしてしまいすいませんでした。 迷惑だ とか けしからん とかそういう方向のことを言っているわけじゃないので,謝るところではないです. 単に,「読み手が状況を把握し難い状況だと回答も付きにくいだろうから,あなたにとって損なのでは?」と言っているだけなので. (例えば,起こってる現象が明確に書かれていれば,この手の処理をDirectXでやったことがあってそういう経験をした人がそれを見れば即答できるのかもしれないですし.)
nonnon7

2021/09/03 13:27

行列部分が間違っていたみたいです。無事平行移動させることができました。 何度も対応していただきありがとうございました。
guest

回答1

0

ベストアンサー

「質問への追記・修正の依頼」で触れましたが,
行と列の取り違えの可能性,すなわち…

この部分

XMFLOAT3 vecX = XMFLOAT3(mtx._11*valueX, mtx._12*valueX, mtx._13*valueX); XMFLOAT3 vecY = XMFLOAT3(mtx._21*valueY, mtx._22*valueY, mtx._23*valueY);

が,↓のようであるべき,という話はありませんか?

XMFLOAT3 vecX = XMFLOAT3(mtx._11*valueX, mtx._21*valueX, mtx._31*valueX); XMFLOAT3 vecY = XMFLOAT3(mtx._12*valueY, mtx._22*valueY, mtx._32*valueY);

投稿2021/09/03 04:27

fana

総合スコア11996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2021/09/03 04:31

4x4の並びに対して, mtx._12 っていうのが,ココ: □■□□ □□□□ □□□□ □□□□ なのか,それとも,こっち: □□□□ ■□□□ □□□□ □□□□ なのか? っていう.
fana

2021/09/03 04:34

DirectXは知らんのだけど,OpenGLと式が逆向きみたいな話を聞いたことがあるような気がするので, そこから推測すると, 「カメラ座標系のX軸方向単位ベクトルをワールド座標系で書いたもの」は,ここになるんじゃないかな? ■□□□ ■□□□ ■□□□ □□□□
nonnon7

2021/09/03 13:36

参考にしていたサイトがOpenGLで書いてあったので、指摘していただいた行列部分が間違っていたようです。 質問が解決しただけでなく、行列を理解するとてもいい勉強になりました。 何度も対応していただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問