我只需要知道我的光标指向哪个角度(x,y,z矢量)。所以我可以朝我所指的方向发射任何粒子。
我不能使用深度测试,所以典型的采摘方法不是一种选择。
只有数学才能做到这一点吗?如果我知道视图,端口,纵横比和透视等?
编辑:,我需要从空场景中得到坐标。完全是空的,一点都不画!
发布于 2010-07-27 16:36:06
gluUnProject
发布于 2010-07-27 15:06:54
简单的答案是,渲染场景的一部分涉及到将世界坐标转换为查看坐标--基本上,相对于我的眼球而言,所有的内容都在哪里。
视图平面是屏幕,这就是鼠标所处的位置。如果你的鼠标坐标是(xx,yy),那么它可能位于(xx,yy,1)或(xx,yy,-1)的视图坐标。您可能需要使用一个系统,其中(0,0)是您的视口在屏幕上的中心-不是鼠标协调通常的工作方式,但不变的偏移是很容易的。
zz=0是玩家所在的位置,而视图平面是前面、玩家和他能看到的东西之间的一段短距离。这就是为什么视图平面被作为(xx,yy,1)或(xx,yy,-1)在这里-如果你使用+1 (我认为是正常情况),并且视图坐标为正z的物体就在你前面。
若要将此转换回世界协调,请应用相同的转换,将您的世界协调器转换为查看协调,但向后转换。然后你得到你的鼠标指针的位置在世界协调。要得到方向矢量,减去玩家的位置。
向后转换在每一步都使用逆矩阵,并向后应用步骤。原则上,所有步骤都可以组合成一个矩阵,并且可以为整个变换计算一个逆矩阵--但这不是最好的方法。例如,计算旋转的逆比计算一般矩阵的逆要容易得多。如果您从世界协调到查看协调的转换是根据需要从组件组成的(位置、方向.)您只需要计算反转组件并将它们组合起来。而不是30度左(从世界到视图),你使用30度-右(从视图到世界)等。
如果你幸运的话,你可以完全放弃玩家位置的整个问题--计算鼠标指针在视图空间中的角度(欧拉角就足够了),然后只应用视点到世界转换的方向部分。
不,这是公式,抱歉,部分原因是世界对世界的转换取决于你如何进行从世界到视图的转换,部分原因是我没有一个简单的例子。
虽然问题不同,但你可以在这里找到一些相关的参考资料.
发布于 2010-07-27 15:08:20
如果你认为你的整个场景适合一个金字塔,你的眼睛在顶峰(面向底部),你的屏幕是一个横截面平行于底部,整个场景是投影(到2D空间)。想必,你知道屏幕的尺寸,以及光标在2D空间的位置。
你可以从X面看那个金字塔,然后从Y边再看一遍,把问题变成两个直角三角形。三角形的底部由从“眼睛”到屏幕中心的直线定义,低音由从“眼睛”到光标的直线定义。
当光标位于2D显示的极端角时,您可以知道角度(给定的透视信息),因此您可以确定“眼睛”离2D投影平面(或三角形底部的长度)有多远(以像素为单位)。使用这个长度,以及三角形的另一边的长度(光标的x坐标或y坐标),您可以确定角度。所有这些都使用基本的trig。
如果有帮助,可以画出所有相关的三角形:
(0, 0);(base, 0);(base, Y_MAX)定义的三角形,其中Y_MAX是光标(屏幕上边缘)的最大值。base = Y/tan(max_angle)(0, 0);(base, 0);(base, X_MAX)定义的三角形。(0, 0);(base, 0);(base, Y)定义的三角形,其中Y是光标的y位置.angle = (tan^(-1))(Y/base)(0, 0);(base, 0);(base, X)定义的三角形。https://stackoverflow.com/questions/3344717
复制相似问题