gluLookAt(eyeX,eyeY,eyeZ,
centerX,centerY,centerZ,
upX,upY,upZ)
で求めたカメラの位置、姿勢があります
eyeはワールド座標系でのカメラの位置
centerはワールド座標系での目視点
upはワールド座標系でのカメラの上方向
カメラ座標系でx,y,zにカメラを平行移動,
目視点を回転軸としてカメラを回転移動
させたいのですがどうすれば良いでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
カメラ座標系でx,y,zにカメラを平行移動,
というのは,
eyeX,eyeY,eyeZ
centerX,centerY,centerZ
の値を平行移動した座標に更新して,再度 gluLookAt() でマトリクスを更新する部分の処理をやり直せばよいでしょう.
元々,
gluLookAt(eyeX,eyeY,eyeZ, centerX,centerY,centerZ, upX,upY,upZ)
として引数を与えることができている時点で,その時点におけるカメラ座標系の基底ベクトルは既知(算出方法が既知)なわけですから,カメラ座標系の規定ベクトル方向に平行移動する処理は自明でしょう.
例えば,
カメラ座標系のx方向単位ベクトルが u であるとき,
カメラ位置 E = ( eyeX, eyeY, eyeZ ) を,カメラ座標系のx方向にsだけ移動させたいのであれば,
E を,(E + su) に更新すればよいですね.
カメラの姿勢を変えずに平行移動したいならば,
(centerX,centerY,centerZ) についても同じ更新を施せばよいですね.
目視点まわりの回転については,(centerX,centerY,centerZ)の値は保ち,
所望の回転軸周りの回転によって,基底ベクトルの方向と,座標(eyeX,eyeY,eyeZ)とを更新すれば良いでしょう.
[追記]
カメラを平行移動
というのは,
「カメラ位置はそのままにしておき,全てのモデルを(逆方向に)平行移動」することと同じなので,
そういう方向で物事を考えれば,
現在の ModelView マトリクスに,「逆方向に平行移動させる行列」を左から乗じるという形になります.
単純には,
glMatrixMode( GL_MODELVIEW ); glLoadIdentity(); glTranslated( 逆方向の並進移動量 ); gluLookAt( 既存の内容 );
とか書く感じですね.
まぁ,
- 「"カメラの位置" という意味として扱っている数値の側を変更する」と考えて gluLookAt() に渡す引数値を変えてやる
- 「モデル群を逆方向に移動させてやればいいよね」と考えて,glTranslated() とかでやる
のどちらであろうが,結局は単一のModelViewマトリクスをいじくっているだけで,やってることは同じなので,「頭の中で考えている話の捉え方が違う」だけですが.
投稿2021/05/31 02:24
編集2021/06/02 04:27総合スコア11996
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2021/06/01 12:09
2021/06/02 01:17
2021/06/02 02:09
2021/06/02 02:15 編集
2021/06/02 02:48 編集
2021/06/02 10:35
2021/06/02 11:39
2021/06/02 11:48 編集
2021/06/02 11:52
2021/06/02 11:53
2021/06/02 11:58
2021/06/03 03:18 編集
2021/06/03 01:05 編集
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。