2013-08-22 32 views
0

我有我的代码,用于将每面镜子渲染为RenderTarget2D的纹理。在XNA中正确渲染镜像

这一切都很完美,但我仍然认为反射方式有问题(比如,镜子看起来并不是那么粗糙)。

镜子的截图看起来并不真实,当玩家靠近镜子时主要发生扭曲。

Mirror Sample Image

这是我的用于创建镜纹理代码,请注意,反射镜通过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矩阵的方式,感谢您的帮助。

回答

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

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

虽然我不知道wher正常的镜子是。另外,我注意到1行我不能真正理解

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

这是什么意思?假设你的相机已经蹲下 - 它的Y值不应该降低吗?我不知道你是如何渲染你的主摄像头的,但看看镜子的渲染位置 - 它比你的主眼低。我不知道你如何使用你的IsCrouched会员,但是如果你想降低摄像机,只需自己写一个方法Crouch()或其他类似的东西,这会降低Y值。稍后,您使用的是DrawRoom方法,其中您通过camera.position参数 - 但它不会被蹲下值“降低”,它只是“纯粹”的camera.position。这可能是它没有正确渲染的原因。让我知道如果这帮助了你什么。

+0

虽然这可能是错误的,但'cameraFinalTarget'(我应该叫做'mirrorTarget')基本上是相机的位置,但是在X轴和Y轴的反射镜位置('(2 * mirrorPos .X) - camera.position.X'实际上是'mirrorPos.X - (camera.position.X - mirrorPos.X)',Y轴是相同的)。 –

+0

你从哪里得到的?你应该使用点积来计算一个适当的反射向量。它是V-2(V dot n)n,其中n是镜子的归一化法向量。 – Tarec

+0

您可能还需要取消反射矢量,具体取决于您注意V(从镜子表面到镜子表面)的方式。 – Tarec