首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >3D场景转换不太有效

3D场景转换不太有效
EN

Stack Overflow用户
提问于 2015-02-14 17:20:30
回答 1查看 143关注 0票数 0

为了将屏幕空间坐标转换为世界空间坐标,我做了以下计算:

WorldSpace向量=逆(投影矩阵)*逆(视图矩阵)* ScreenSpace向量

到目前为止,我相信我的大部分计算都是正确的,但是我不确定如何执行最后一步,以便将我的向量转换为世界坐标。

问题:

  • 我被告知,这个过程的最后一步是将我的结果除以变量"w“,因为我们使用的是齐次坐标。然而,我不知道"w“代表什么。

我定义了以下变量(x和y是鼠标坐标的整数):

代码语言:javascript
复制
GLint viewport[4];
GLfloat winX, winY;
glGetIntegerv(GL_VIEWPORT, viewport);

winX = ((float)x/viewport[2]*2)-1;
winY = ((float)(viewport[3]-y)/viewport[3]*2)-1;

glm::mat4x4 mMatrix;
glm::mat4x4 vMatrix;

glm::mat4x4 cameraTransformation;

我执行了以下转换:

代码语言:javascript
复制
cameraTransformation = glm::rotate(cameraTransformation, (float)alpha*(float)M_PI/180, glm::vec3(0, 1, 0));
cameraTransformation = glm::rotate(cameraTransformation, (float)beta*(float)M_PI/180, glm::vec3(1, 0, 0));

glm::vec4 cameraPosition = (cameraTransformation * glm::vec4(camX, camY, distance, 0));
glm::vec4 cameraUpDirection = cameraTransformation * glm::vec4(0, 1, 0, 0);

vMatrix = glm::lookAt(glm::vec3(cameraPosition[0],cameraPosition[1],cameraPosition[2]), glm::vec3((float)camX, (float)camY, 0.0), glm::vec3(cameraUpDirection[0],cameraUpDirection[1],cameraUpDirection[2]));

glm::mat4x4 mat =  glm::inverse(vMatrix) * glm::inverse(mMatrix) * glm::inverse(pMatrix);
glm::vec4 wSC = (mat) * glm::vec4(winX,winY,0,0);

在我的调整大小事件中,我的pMatrix被投影为这样:

代码语言:javascript
复制
pMatrix = glm::mat4x4(1.0);//sets identity
pMatrix = glm::perspective( (float)fov*(float)M_PI/180, (float) width / (float) height, (float)0.001, (float)10000 );

注意:我过去在使用GLU库时遇到过问题,显然在总体上使用unProject函数也有问题,所以我选择自己执行计算。在这一点上,这几乎是一个努力的理由,但我不打算使用预先存在的非投影函数周期。

EN

回答 1

Stack Overflow用户

发布于 2015-02-15 16:47:26

在我的射线采集问题的最后一个阶段,我被告知我做了几件错事:

  1. 平面附近窗口空间的z坐标应该是-1,而不是0。
  2. 提醒我,我需要两个不同的向量在对立的平面,不要只使用1进行测试,运行它通过实际的射线选择器,看看它是否工作。
  3. 使用"w“值为1,而不是0。这是glm::vec4 wSC = (mat) * glm::vec4(winX,winY,0,0);行的最后一个点。
  4. 在执行任何计算之前,我需要将鼠标坐标转换为NDC坐标,所以如下所示:
  • 鼠标x除以屏幕宽度,乘以2,减去1。
  • 屏幕高度减去鼠标y,除以屏幕高度,乘以2,减去1:winX = ((float)x/viewport[2]*2)-1; winY = ((float)(viewport[3]-y)/viewport[3]*2)-1;

由于我的问题持续了相当长的时间,并且回答了几个问题,所以我要感谢几个帮助我的人:

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

https://stackoverflow.com/questions/28518139

复制
相关文章

相似问题

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