Original Description:
某掲示板で、「地形の傾斜に沿ってカメラの向きを変えたい」というスレッドがあった。あるプロジェクトで試したことはあったが、かなり特殊な環境だったので、非常に汎用性のない書き込みをしてしまった。しかも嘘ついてるし。。。申し訳ない。ということで気を取り直し、再度挑戦する。そういえば、SOLAにも未実装の機能。「地面の高さに合わせてウォークスルー」することはできるが、「勾配にあわせて首を振る」ことはしない。まぁ、すぐに出来るだろうと思いつつ、数時間。予想外に難航。当初の予定では「首を振る」角度をベクトル計算から求めるつもりだったが、かなり頭に重い計算。スマートさ(逃げ道)を考え、「pointAt」で逃げ切れた。一人称のカメラで移動したら分かるが、法線を取得するたびに角度を変更すると、メッシュがスムーズでない限りカクカクして見苦しい。実装するにはかなりの工夫が必要だ。基本部分もまだまだ改善の余地がある。
・操作方法
マウスドラッグでモデルの移動
キーボード「C」でカメラの切り替え
・要点
modelsUnderRay で面の法線を取得
外積で向きたい方向のベクトルを取得
pointAtで面と平行に向く
・サンプルコード
myPos = myCamera.transform.position
t = -myCamera.transform.yAxis
underRay = myMember.modelsUnderRay( p, t, 1, #detailed)
normalVec = underRay[1][#isectNormal]
lookAt = normalVec.cross(myCamera.transform.xAxis)
myCamera.poitAt( myPos + lookAt )