我有我的代码,用于将每面镜子渲染为RenderTarget2D的纹理。在XNA中正确渲染镜像
这一切都很完美,但我仍然认为反射方式有问题(比如,镜子看起来并不是那么粗糙)。
镜子的截图看起来并不真实,当玩家靠近镜子时主要发生扭曲。
这是我的用于创建镜纹理代码,请注意,反射镜通过15度的X轴转动。
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矩阵的方式,感谢您的帮助。
虽然这可能是错误的,但'cameraFinalTarget'(我应该叫做'mirrorTarget')基本上是相机的位置,但是在X轴和Y轴的反射镜位置('(2 * mirrorPos .X) - camera.position.X'实际上是'mirrorPos.X - (camera.position.X - mirrorPos.X)',Y轴是相同的)。 –
你从哪里得到的?你应该使用点积来计算一个适当的反射向量。它是V-2(V dot n)n,其中n是镜子的归一化法向量。 – Tarec
您可能还需要取消反射矢量,具体取决于您注意V(从镜子表面到镜子表面)的方式。 – Tarec