到目前为止,我对这些空间的理解是,它们定义了游戏3d世界的一个特定方面。视图空间实际上只是摄像机,我们通过创建一个矩阵来定义这一点,该矩阵包含相机的位置、摄像机的目标和相机的“向上”方向。
所有这些都是按照以下代码完成的..。
XMMATRIX CameraView;
XMVECTOR CameraPosition;
XMVECTOR CameraTarget;
XMVECTOR CameraUp;
/* Describing the matrix */
CameraPosition = XMVectorSet(0.0f, 0.0f, -0.5f, 0.0f);
CameraTarget = XMVectorSet(0.0f, 0.0f, 0.0f, 0.0f);
CameraUp = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f);
/* Creating the matrix*/
CameraView = XMMatrixLookAtLH(CameraPosition, CameraTarget, CameraUp); 我很难在脑海中想象这件事。所以简单地说..。我只是通过创建CameraView来“让”玩家随意移动吗?(假设3d世界已经创建)
有人能告诉我这里到底发生了什么吗?
发布于 2015-07-17 04:33:21
第一个建议:由于您对DirectXMath和Direct3D完全陌生,您应该特别看看DirectX工具包和SimpleMath包装器。这会给你省去很多麻烦。
当呈现一个对象时,实际上只有一个转换到位。它从它定义的任何坐标系(称为“局部”或“模型”坐标空间)获取对象,最终结果是一个x,y像素位置和一个z深度。
然而,对于人类来说,通常更容易将这种转换看作是分阶段发生的--事实上,由于同质坐标的力量和通过乘法连在一起,实际上它只是一个向量矩阵的乘积。这通常被认为是world -> view -> projection。
XMMatrixTranslation、XMMatrixRototation*和XMMatrixScaling函数相乘而创建的(在库中还有许多其他方法来创建转换矩阵,包括使用四元数进行旋转)。XMMatrixPerspectiveFovLH、XMMatrixOrthographicLH和相关函数完成的。请参阅三维投影
RE:手感
选择“左撇子”与“右撇子”的观看系统纯粹是一个品味问题,以及你的内容是如何定义的。历史上,Direct3D使用左手坐标,OpenGL使用右手坐标.在现代可编程着色器中,没有什么是内置在系统中的。你只需要保持一致。和SimpleMath使用“右手”系统。99%的病例使用DirectXMath。
请参阅右手法则
发布于 2015-07-17 08:00:00
将物体转换为“视图空间”基本上是根据摄像机的位置和方向/旋转情况,将它们相对于摄像机重新定位。
视图或摄像机矩阵本身就是使用相机的参考框架来构建的:想象一个x,y和z矢量从摄像机中出来,跟随摄像机的任何旋转,这样它们总是从摄像机的顶部、右边和前面出来。它们通常分别被称为向上向量、右向量和视图向量。
视图向量是通过查看点和位置,即
视图向量= lookAt -位置。
然后使用新计算的视图向量和所提供的向上向量的交叉乘积创建相机的右矢量。
右向量=视图向量X向上向量
最后,使用新的视图和正确的向量创建相机的“实”向上向量。
向上向量=右向量X视图向量
作为一个非常重要的注意事项,您需要确保这三个向量都是正规化的。这听起来非常技术性,但只是意味着这三个人的长度是1,而且彼此之间的距离是90度,或者有趣的事情可能会发生在像拉伸和变形这样的模型上。
如何在视图矩阵本身中使用这些向量,就是创建矩阵的左上角3x3部分。然后,取决于您使用的是行向量还是列向量,最下面的最一行或最右边的列使用相机的位置。
现在,真正的诀窍是存储的值实际上是位置/旋转的反义词。想想看。如果你有一个相机,并将它移动到正确的位置(2,0,0),你将不得不将所有的物体-2.0向左转换,以达到你期望的移动相机的效果。同样地,对于旋转-旋转相机向右,物体应该相对于相机向左移动。
因此,对于定位在(4,5,3)且没有旋转的摄像机,在视图矩阵中使用列向量应该如下所示:
[1 0 0 -4]
[0 1 0 -5]
[0 0 1 -3]
[0 0 0 1]恰克·沃尔博恩说过,很多时候,许多物体的转换都是一种乘法,使用的是从世界生成的矩阵、视图、投影矩阵,但在某些情况下,你会希望在阴影中使用模型视图矩阵(没有投影)中的视图空间,比如根据你的方法进行照明。
https://stackoverflow.com/questions/31467619
复制相似问题