我真的不明白“相机”如何与D3D9配合使用
首先,我如何设置相机:
public Camera()
{
this.eye = new Vector3(0.0f, 0.0f, 0.0f);
this.lookAt = new Vector3(0.0f, 0.0f, 1.0f);
this.up = new Vector3(0.0f, 1.0f, 0.0f);
viewMatrix = Matrix.LookAtLH(eye, lookAt, up);
projectionMatrix = Matrix.OrthoLH(1 * zoomLevel, 1 * zoomLevel, 0.0f, 1.0f);
}
我的顶点:
vertices = new VertexTexture[]
{
new VertexTexture()
{
Position = new Vector4(0.0f, 0.0f, 0.0f, 1.0f),
TextureCoord = new Vector2(0.0f, 1.0f)
},
new VertexTexture()
{
Position = new Vector4(0.0f, model.Height, 0.0f, 1.0f),
TextureCoord = new Vector2(0.0f, 0.0f)
},
new VertexTexture()
{
Position = new Vector4(model.Width, model.Height, 0.0f, 1.0f),
TextureCoord = new Vector2(1.0f, 0.0f)
},
new VertexTexture()
{
Position = new Vector4(model.Width, 0.0f, 0.0f, 1.0f),
TextureCoord = new Vector2(1.0f, 1.0f)
}
};
有效。我可以移动相机,变焦等等。
但相机属性对我来说似乎很奇怪!我认为它会是这样的:
public Camera()
{
this.eye = new Vector3(0.0f, 0.0f, 1.0f);
this.lookAt = new Vector3(0.0f, 0.0f, 0.0f);
this.up = new Vector3(0.0f, 1.0f, 0.0f);
viewMatrix = Matrix.LookAtLH(eye, lookAt, up);
projectionMatrix = Matrix.OrthoLH(1 * zoomLevel, 1 * zoomLevel, 0.1f, 100.0f);
}
但是使用这些参数它不起作用。如果我更改了我的计划的Z坐标(需要将其设置为0才能工作)。
现在,我尝试渲染其他对象。我为球体生成顶点(它在D3D 10上工作正常,在(0; 0; 0)周围生成1个半径球体)但屏幕上没有任何内容
我玩了眼睛和lookat参数,但我可以想办法让它工作,所以,我做错了什么?
答案 0 :(得分:1)
首先,一些背景知识。在正交投影中,我们在技术上不需要Z坐标变换,但事实上D3D系统并不关心你使用什么样的投影 - 对于设备来说它只是一个变换矩阵,仅此而已。因此,无论投影类型如何,Z坐标都始终转换。另一方面,相机坐标不由投影矩阵变换(否则定位将是一场噩梦)。现在让我们回到你的情况,看看发生了什么。
在OrthoLH
中指定zn = 0.1f,您声明这是您的最小深度。因此,每个顶点的深度都会移动-0.1f。你的顶点布局转换后Z将是0.9f,但你还记得相机不受影响吗?所以,它仍然处于深度1.0f,这就是为什么你什么也看不见:相机背后没有顶点。
在这里添加浮动计算错误,你会明白为什么设置相机在0.9f有时有帮助,有时不帮助。但是,将位置设置为0.8f对任何情况都适用。
答案 1 :(得分:0)
首先,谢谢你的回答。 我设法通过设置具有该属性的相机来避免此问题:
this.eye = new Vector3(0.0f, 0.0f, 0.0f);
this.lookAt = new Vector3(0.0f, 0.0f, 1.0f);
this.up = new Vector3(0.0f, 1.0f, 0.0f);
viewMatrix = Matrix.LookAtLH(eye, lookAt, up);
projectionMatrix = Matrix.OrthoLH(1 * zoomLevel, 1 * zoomLevel, 0.0f, 10000000.0f); :D
我会再次阅读你所说的内容,并会考虑最好的解决方法:)
我认为我的问题与我的顶点有关...例如,我生成一个半径为20的球体,然后我通过根据我的屏幕坐标缩放,将这些顶点转换为对应于20px宽的球体
worldMatrix = SlimDX.Matrix.Identity;
worldMatrix = SlimDX.Matrix.Scaling(new Vector3(2.0f / ControlWidth, 2.0f / ControlHeight, 1.0f));
worldMatrix = SlimDX.Matrix.Multiply(worldMatrix, SlimDX.Matrix.Translation(new Vector3(-1.0f, -1.0f, 0.0f)));
我的X / Y缩放是可以的。但是如何缩放Z坐标? 2.0 /((ControlHeight + ControlWidth)/ 2)?
我会再次阅读你的经理,了解一切:)