Articles of 光线

使用gluUnProject或倒转的MVPmatrix获得射线

我已经阅读了很多这里的主题,在SO,opengl.org等。示例gluUnProject应该如何工作(从NeHe教程): winX = (float)x; winY = (float)viewport[3] – (float)y; glReadPixels( x, int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ ); gluUnProject( winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ); 问题是, gluUnProject返回大多为零,如果不是零,则返回世界坐标系中的摄像头位置。 价值winZ我从glReadPixels得到永远是正确的,如果我缩放如下: float z_distance = ProjectionMatrix[14] / (winZ * -2.0 + 1.0 – ProjectionMatrix[10]); 包含鼠标点击点的近平面和平面平面之间的距离。 看下面的示例: gluUnProject( winX, winY, -1, modelview, projection, viewport, &posX1, &posY1, &posZ1); […]

限制Quaternion / vector3 ax在一定的时间间隔内

我有些麻烦要理解,并且处理Quaternion和Vector3。 我正在改进教程坦克统一: 编辑:因为一个video解释好得多,有一个链接到30次端video我: https : //www.youtube.com/watch?v= nNrmlfbHNTI&feature = youtu.be 在第一部分,炮塔转动与两线newRotation.z = 0.0f; and newRotation.x = 0.0f; newRotation.z = 0.0f; and newRotation.x = 0.0f; (见下面的代码)。 第二部分,我只是评论这两行。 我的问题是:我希望能够上下查看(就像在video的第二部分,但是有一个DEPRESSION LIMIT (不要看起来太高和太低) 我尝试了曼尼的情况下,不能管理我想要做的事情…有参考坦克炮塔脚本的代码: public float m_TurnSpeed = 8f; private Transform m_Transform; private int floorMask; private float camRayLength = 100f; void Awake() { floorMask = LayerMask.GetMask ("Ground"); m_Transform = GetComponent […]

保持同一级别的光线投射

我想让我的光线在某个高度结束(红线)。 但是,由于游戏是3D,相机旋转,我不能使用固定的幅度。 我认为是一个天才的冲击,我想我会把高度向量(a)投射到射线方向来获得向量(b)。 结果是在正确的方向,但是b的数量还不够大。 想要的结果是让vectorb总是到达红线(幅度改变取决于相机)。 我以前的vector投影知识说,它应该工作,但显然它不。 我在哪里错了? —-编辑:问题澄清—- 第一步:根据使用的input投射射线。 它没有打任何的gameobjects。 第二步:检查中间区域(红线),看看是否有任何游戏对象足够接近(绿色圆圈)。 为了这个工作,我需要bvector的大小来使用Ray.GetPoint() 。

数百个网格上的个体代理同时视线?

我有一个拥有数百个独立代理的大型网格,每个代理都基于自己的视觉input和快速控制algorithm进行移动。 我的问题是:我怎样才能有效地为每个代理提供他们可以看到的一系列其他代理(或墙壁)? 从每个人的作品射线铸造,但速度缓慢。 似乎我应该能够在每一步预处理世界以加快这个过程,因为我会做很多次,但是我还没有能够提出一个合适的algorithm。 有没有我已经错过的一些已知的诡计?

在OpenGL中使用Raypicking /光线跟踪

好的,所以在你投票之前说OpenGL不支持光线渲染,请阅读: 所以我想在opengl 1.1中检测一个四元组(我不想使用opengl 3.0)。 我想用OpenGL来检测它,但这似乎不可能。 但基本上我有一个select,这是一种“哈克”。 我创建自定义matrix并将转换的顶点存储在某处,然后进行简单的碰撞testing。 在传统OpenGL中进行光线跟踪的常用方法是什么?

光标位置到使用角度的3D光线

我一直坚持一个月试图让gluUnProject工作。 在我尝试使用gluUnProject失败(以及尝试手动实现gluUnProjectfunction)后,我实现了使用角度获取ray的方法。 float RadToDeg = 180.0f / (float)M_PI; // conversion coefficient to degree float DegToRad = 1 / RadToDeg; // conversion coefficient to radians float DeltaX = tan(fovy/2 * DegToRad) * 2 * (Width / 2 – winX) * zNear / Height; float DeltaY = tan(fovy/2 * DegToRad) * 2 * (Height / 2 – […]

如何计算raymarching中距离的视锥半径?

我是GLSL的“raymarching distance fields”(适当的术语:球体追踪)。 为了在其顶上实现锥形行进(并且无论是否添加锥形行进,还要最小化光线行进步骤的数量),我需要估计在任何给定距离处的光线锥的半径。 回想一下raymarching距离场,当到一个物体的距离小于一个阈值时,通常在代号为nearLimit或epsilon的地方logging一个“命中”。 这个阈值可以看作是等价于射线锥半径,如果我们随着距离的增加呈指数增长 – 这样,我们就不会将直射的细射线射入空间,而是锥体会根据透视投影而扩大。 这更精确地覆盖了捕捉“正确”的远处物体(在这一点上我们忽略混合材料和过滤距离为t的视锥中的所有相交物体的法线的问题)。 在第0步,这个半径可以近似于类似的东西 float fInitialRadius = 1 / min(screenwidth, screenheight); 然后可以通过将起始半径应用于距离来按指数规律在每个步骤增加: fNearLimit = fTotalDist * fInitialRadius; // after each raymarching step 这工作正常,但仍然有文物。 如果我使用fInitialRadius * fInitialRadius(导致从一个640px帧缓冲区的初始半径和一个单位宽度的视图平面是1/640的较小的数字)我得到更less的文物和更准确的结果。 但这两种方法都是不准确的,第一种是太急(半径太早太早),后者太懒(半径增加太小太迟)。 在给定的距离上增加fNearLimit /锥体半径的最准确的因素最有可能考虑到我当前的视野,并且将取决于视场是45°还是60°或90°或者… TL; DR :我想知道给定步骤0的初始像素半径和视场角θ 的给定距离处锥体半径的正确计算或最可接受的近似值是多less?

快速三维视线计算algorithm

我有一个基于棋盘的棋盘游戏,其中单位在2D空间等距视图中的3D空间中移动。 当计算一个单位的攻击牌时,我如何确认他们没有穿过墙壁或者他们看到的高度。 我需要快速validation这些攻击瓦片是在一个单位的范围内(约20)。 我可以用x,y和z轴validation视线的最快方法是什么? 有人在这里发布了一个类似的问题,但是它包括2D视域计算而不是3D(使得答案非常不同)。

体素遍历相交的浮点位置

我有一个立方体的3D网格,并使用本文的algorithmhttp://www.cs.yorku.ca/~amana/research/grid.pdf我已经能够获得第一个瓷砖相交的整数坐标由一条随机线。 我的问题是,有没有简单的方法来获得交点浮点位置? 我已经能够得到正常的,但不是位置…

简单的厄运风格引擎问题

我刚开始制作一个类似于Wolfenstein / Doom的伪3D 3D FPS引擎。 我没有做太多的阅读,所以我的实现可能非常天真。 我目前的工作原型有一个'鱼眼'失真[第二图像]这是有道理的,因为墙的中间比远边更近,但这不是Doom的外观。 什么是正确的方法来做到这一点? 正交投影似乎是错误的,因为你会失去透视。