首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我需要澄清“空间”的概念(世界空间、视图空间、投影空间、局部空间和屏幕空间) (c++,direct3d 11)。

我需要澄清“空间”的概念(世界空间、视图空间、投影空间、局部空间和屏幕空间) (c++,direct3d 11)。
EN

Stack Overflow用户
提问于 2015-07-17 02:36:06
回答 2查看 825关注 0票数 0

到目前为止,我对这些空间的理解是,它们定义了游戏3d世界的一个特定方面。视图空间实际上只是摄像机,我们通过创建一个矩阵来定义这一点,该矩阵包含相机的位置、摄像机的目标和相机的“向上”方向。

所有这些都是按照以下代码完成的..。

代码语言:javascript
复制
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世界已经创建)

有人能告诉我这里到底发生了什么吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-17 04:33:21

第一个建议:由于您对DirectXMath和Direct3D完全陌生,您应该特别看看DirectX工具包SimpleMath包装器。这会给你省去很多麻烦。

当呈现一个对象时,实际上只有一个转换到位。它从它定义的任何坐标系(称为“局部”或“模型”坐标空间)获取对象,最终结果是一个x,y像素位置和一个z深度。

然而,对于人类来说,通常更容易将这种转换看作是分阶段发生的--事实上,由于同质坐标的力量和通过乘法连在一起,实际上它只是一个向量矩阵的乘积。这通常被认为是world -> view -> projection

  1. “world”矩阵将在局部坐标中定义的点放置到“world”坐标中。这允许所有的模型在他们自己的地方坐标,然后放置相对于一个场景-另一个。世界坐标系也是你规范地定义你的光源所在的地方。这通常是通过将XMMatrixTranslationXMMatrixRototation*XMMatrixScaling函数相乘而创建的(在库中还有许多其他方法来创建转换矩阵,包括使用四元数进行旋转)。
  2. “视图”矩阵将世界上的坐标空间中的点移动到视图坐标空间中,这通常被认为是摄像机如何看待事物。这就是你所展示的计算代码片段。给定相机在世界坐标中的位置,在世界坐标中的摄像机目标位置,以及任意的“向上”矢量,该函数计算“视图”矩阵需要使用的“左手”查看坐标(因此是"LH")。
  3. “投影”矩阵将点从视图系统移动到定义“投影”的通用规范化框中,包括应用透视图或正交投影。对于DirectXMath,这是用XMMatrixPerspectiveFovLHXMMatrixOrthographicLH和相关函数完成的。

请参阅三维投影

RE:手感

选择“左撇子”与“右撇子”的观看系统纯粹是一个品味问题,以及你的内容是如何定义的。历史上,Direct3D使用左手坐标,OpenGL使用右手坐标.在现代可编程着色器中,没有什么是内置在系统中的。你只需要保持一致。和SimpleMath使用“右手”系统。99%的病例使用DirectXMath。

请参阅右手法则

票数 1
EN

Stack Overflow用户

发布于 2015-07-17 08:00:00

将物体转换为“视图空间”基本上是根据摄像机的位置和方向/旋转情况,将它们相对于摄像机重新定位。

视图或摄像机矩阵本身就是使用相机的参考框架来构建的:想象一个x,y和z矢量从摄像机中出来,跟随摄像机的任何旋转,这样它们总是从摄像机的顶部、右边和前面出来。它们通常分别被称为向上向量、右向量和视图向量。

视图向量是通过查看点和位置,即

视图向量= lookAt -位置。

然后使用新计算的视图向量和所提供的向上向量的交叉乘积创建相机的右矢量。

右向量=视图向量X向上向量

最后,使用新的视图和正确的向量创建相机的“实”向上向量。

向上向量=右向量X视图向量

作为一个非常重要的注意事项,您需要确保这三个向量都是正规化的。这听起来非常技术性,但只是意味着这三个人的长度是1,而且彼此之间的距离是90度,或者有趣的事情可能会发生在像拉伸和变形这样的模型上。

如何在视图矩阵本身中使用这些向量,就是创建矩阵的左上角3x3部分。然后,取决于您使用的是行向量还是列向量,最下面的最一行或最右边的列使用相机的位置。

现在,真正的诀窍是存储的值实际上是位置/旋转的反义词。想想看。如果你有一个相机,并将它移动到正确的位置(2,0,0),你将不得不将所有的物体-2.0向左转换,以达到你期望的移动相机的效果。同样地,对于旋转-旋转相机向右,物体应该相对于相机向左移动。

因此,对于定位在(4,5,3)且没有旋转的摄像机,在视图矩阵中使用列向量应该如下所示:

代码语言:javascript
复制
[1 0 0 -4]
[0 1 0 -5]
[0 0 1 -3]
[0 0 0  1]

恰克·沃尔博恩说过,很多时候,许多物体的转换都是一种乘法,使用的是从世界生成的矩阵、视图、投影矩阵,但在某些情况下,你会希望在阴影中使用模型视图矩阵(没有投影)中的视图空间,比如根据你的方法进行照明。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31467619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档