0

各フレームの RenderTarget2D からのテクスチャを使用してミラーを平面として表示するために作成したコードがあります。

これはすべて完全に正常に機能しますが、反射の仕方に何か問題があると思います (たとえば、ミラーが見ているは​​ずの場所を正確に見ていないなど)。

ミラーのスクリーンショットがありますが、見た目はそれほど悪くありません。プレイヤーがミラーに近づくと、主に歪みが発生します。

サンプル画像をミラーリング

ミラー テクスチャを作成するコードは次のとおりです。ミラーが X 軸上で 15 度回転していることに注意してください。

RenderTarget2D rt;

...

rt = new RenderTarget2D(device, (int)(graphics.PreferredBackBufferWidth * 1.5), (int)(graphics.PreferredBackBufferHeight * 1.5));

...

device.SetRenderTarget(rt);
device.Clear(Color.Black);

Vector3 camerafinalPosition = camera.position;
if (camera.isCrouched) camerafinalPosition.Y -= (camera.characterOffset.Y * 6 / 20);

Vector3 mirrorPos = new Vector3((room.boundingBoxes[8].Min.X + room.boundingBoxes[8].Max.X) / 2, (room.boundingBoxes[8].Min.Y + room.boundingBoxes[8].Max.Y) / 2, (room.boundingBoxes[8].Min.Z + room.boundingBoxes[8].Max.Z) / 2);

Vector3 cameraFinalTarget = new Vector3((2 * mirrorPos.X) - camera.position.X, (2 * mirrorPos.Y) - camerafinalPosition.Y, camera.position.Z);
cameraFinalTarget = Vector3.Transform(cameraFinalTarget - mirrorPos, Matrix.CreateRotationX(MathHelper.ToRadians(-15))) + mirrorPos;

Matrix mirrorLookAt = Matrix.CreateLookAt(mirrorPos, cameraFinalTarget, Vector3.Up);

room.DrawRoom(mirrorLookAt, camera.projection, camera.position, camera.characterOffset, camera.isCrouched);

device.SetRenderTarget(null);

そして、鏡はrtテクスチャを使って描かれています。反射物理学または LookAt マトリックスの作成方法が完全に間違っていると思います。助けてくれてありがとう。

4

1 に答える 1

1

XNA は使用しませんでしたが、かなり前に Managed C# DX を使用したため、あまり覚えていませんがmirrorLookAt、cameraFinalTarget を指定する必要がありますか? 基本的にはMatrix.CreateLookAt、from-to-up ベクトルから行列を作成する必要があるため、例の「to」はミラーが目指すポイントです。カメラの位置からミラーの位置までのベクトルを計算してから反映する必要がありますが、コードには表示されません。

room.DrawRoomメソッドが別の行列を計算しない限り、mirrorLookAtミラー ターゲット ベクトルが問題であると確信しています。

編集:あなたの反射ベクトルは

Vector3 vectorToMirror = new Vector3(mirrorPos.X-camera.position.Y, mirrorPos.Y-camera.position.Y, mirrorPos.Z-camera.position.Z);
Vector3 mirrorReflectionVector = new Vector3(vectorToMirror-2*(Vector3.Dot(vectorToMirror, mirrorNormal)) * mirrorNormal);

また、mirrorReflectionVector を反転してはならないかどうか (ミラーを指しているか、ミラーから指しているか) も覚えていません。両方の方法を確認するだけでわかります。mirrorLookAt次に、 fromを作成します

Matrix mirrorLookAt = Matrix.CreateLookAt(mirrorPos, mirrorReflectionVector, Vector3.Up);

あなたの鏡の法線がどこにあるかはわかりませんが。また、よくわからない1行に気づきました

if (camera.isCrouched) camerafinalPosition.Y -= (camera.characterOffset.Y * 6 / 20);

そのポイントは何ですか?カメラがしゃがんでいると仮定しましょう - その Y 値は既に下げるべきではありませんか? メインカメラのレンダリング方法はわかりませんが、ミラーのレンダリング位置を見てください。メインの目よりもずっと低い位置にあります。メンバーをどのように使用しているかはわかりませんがIsCrouched、カメラを下げたい場合は、メソッドCrouch()などを自分で作成すると、Y 値が少し下がります。後で、パラメーターDrawRoomを渡すメソッドを使用していますがcamera.position、それはクラウチ値によって「下げられる」のではなく、「純粋な」camera.position です。それが適切にレンダリングされていない理由かもしれません。それがあなたに何か役立ったら教えてください。

于 2013-08-22T13:01:40.467 に答える