Articles of 透视

透视投影 – 绘图线

所以我有点理解把3d点投射到2D平面上的math。 这只是一些简单的划分和乘法的距离。 然而,我似乎无法把我的头围绕从三维空间投影到二维平面上。 示范: 只是为了让这个更简单一些,我将会把2D投射到1d线上,因为对于3D到2D来说,这是相同的概念。 所以我的问题是,如果我想将AB线投影到具有设定焦距的观察窗口上,我可以将线(A和B)的两个点投影到透视线上,然后画线在观看窗口之间的那两个之间。 然而,当试图将线CD投影到线上时困难重重。 该线的第二点(D)在观察窗之后,因此不能投射到线上。 那么如何在透视窗口中绘制线条CD呢?

使用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); […]

glm ::透视不工作?

所以我正在学习如何制作游戏和程序,并且在GFLW中使用GLM来设置投影机时,这行代码拒绝工作,我无法想象为什么。 代码在下面的图片中。 谢谢!

在透视matrix的近平面上有没有math上的限制?

我已经注意到,如果在透视摄像机中,我将像0.000001这样的低0.000001数值和1000 0.000001远平面0.000001 ,我的渲染就会出现一些问题,比如奇怪的深度伪像(见下图)或者在非投影过程中被零除。 我不擅长math,但应该有些奇怪,因为如果我把飞机放在0.1一切都按预期工作。 对于我不知道的近平面值有没有math上的限制? 我在JavaScript上使用WebGL(我没有使用Three.js;我的问题与math有关,而不是与特定的框架有关)。 如果它很重要,我使用Float32Array来存储matrix,我使用这些库来做math: https://github.com/Jam3/camera-unproject https://github.com/stackgl/gl-mat4 https://github.com/stackgl/gl-mat4/blob/master/perspective.js 特别是这里除以零的情况发生在 : function project (out, vec, m) { var x = vec[0], y = vec[1], z = vec[2], a00 = m[0], a01 = m[1], a02 = m[2], a03 = m[3], a10 = m[4], a11 = m[5], a12 = m[6], a13 = m[7], a20 = m[8], […]

在基于着色器的核心configuration文件OpenGL中“颠倒Z轴”的方法?

在我的爱好者着色器(非FFP)GL(3.2+核心)“引擎”中,世界空间和模型空间中的所有东西在devise上都是“左撇子”(并且保持这种方式),所以X轴从-1(“左”)到1(“右”),Y从-1(“bottom”)到1(“top”),Z从-1(“near”)到1(“far”) 。 现在,默认情况下,在OpenGL中,NDC空间的工作原理是相同的,但是从我所收集的内容来看,这里的z从1(“near”)延伸到-1(“far”)。 同时,我想理想地继续使用“有点不正式的非标准”matrix函数来进行观察和观察,目前定义为: func (me *Mat4) Lookat(eyePos, lookTarget, upVec *Vec3) { l := lookTarget.Sub(eyePos) l.Normalize() s := l.Cross(upVec) s.Normalize() u := s.Cross(l) me[0], me[4], me[8], me[12] = sX, uX, -lX, -eyePos.X me[1], me[5], me[9], me[13] = sY, uY, -lY, -eyePos.Y me[2], me[6], me[10], me[14] = sZ, uZ, -lZ, -eyePos.Z me[3], me[7], me[11], me[15] = […]

屏幕或世界坐标来平铺坐标

我有在opengl瓷砖制成的飞机。 我开始在(0,0,-20)绘制它们之后,我做了我的翻译,使视图旋转有点类似于等距(种)的观点。 我现在想知道,在每个方向上有多less瓦片可见。 所以我基本上需要知道的是,在翻译的视图中,现在可以看到哪些坐标(“翻译前”空间)。 翻译之前的“瓷砖”(例如在x方向上有14个瓷砖可见): 在翻译之后(现在在“旧”x方向上有28个可见): 我试图通过gluUnproject获得可见区域,但没有成功。 编辑:我已经问过这个问题,当我试图建立在2D完全相同的事情,我得到了一个很好的答案: 计算等轴测图上显示的图块数量 也许这有助于进一步描述我的问题。

在屏幕空间中复制世界空间球体

我正在处理一个后期处理着色器,我正在努力工作。 我使用Unity,并且在屏幕空间中有一个我想要的着色器,作为后期处理的一部分,渲染一个看起来像是在世界空间中绘制的球体。 现在,我尝试了一些不同的方法。 对于所有的尝试,我给着色器一个球体的世界位置,一个球体的屏幕位置和一个相机位置: uniform float4 _SpherePositionCamera; uniform float4 _SpherePositionCamera; uniform float4 _SpherePositionWorld; 也就是说,分别在世界空间相机空间和屏幕空间的相同点。 我试图使用逆投影matrix将屏幕空间中的片段投影到相机空间中,并且在xy坐标系中testing,减去球体的屏幕空间中心长度<1。这在屏幕上给出了一个圆圈真的非常好地跟随世界空间。 gc代码的顶点程序是 v2f vert (appdata_img v){ v2f o; o.pos = mul (UNITY_MATRIX_MVP, v.vertex); o.uv = MultiplyUV (UNITY_MATRIX_TEXTURE0, v.texcoord.xy); o.camPos = mul (inverseProjection, float4((o.uv * 2) – 1, _SpherePositionCamera.zw)); return o; } 而片段程序是 fixed4 frag (v2f i) : COLOR { // Get […]

透视正常值的正确插值

我目前正在编写一个软件光栅化程序,而且我可以使用顶点颜色和透视图正确地绘制任意三角形。 我通过对顶点法线进行线性插值来进行点定向照明,并且它的工作正常,只有在大三角形上,您才能注意到从非常平坦的角度看光线变形。 然而,这只有当你特别寻找它时才可见,但是我想知道是否有办法对法线进行透视矫正。 对于纹理坐标和其他东西,这是通过将值除以W或Z来完成的。但是,如果将vector除以单个数字,则只改变它的幅度,这是无用的,因为我最后正常化vector用于照明计算。 那么,有没有办法做到这一点?

如何在GameMaker中通过精灵缩放来伪造3D角色位移?

我希望我的2D精灵在向下移动屏幕时(靠近相机)变得更大,走远时​​缩小,在向左或向右移动时保持相同的尺寸。 沿y轴缩放很好,但是当我向左移动时,精灵仍然朝右。 我已经把y_scale到x_scale所以精灵保留了正确的比例。 这是问题: 例如,如果image_yscale当前为9,我想向左移动,则将image_xscale设置为-1会导致精灵再次缩小。 如何在保持当前尺寸的同时沿x_scale翻转精灵? 这是我的代码: // Sprite Scaling if keyboard_check(vk_up) { image_yscale -= 0.01 } if keyboard_check(vk_down) { image_yscale += 0.01 } image_xscale = image_yscale if image_yscale < 1 { image_yscale = 1 } 提前感谢您的帮助。

不对称观点

我正在构建一个插件组件,它将显示世界的合成3D视图(一种FLIR相机模拟)。 我面临的问题是,目前我正在使用对称的全景视图,并始终指向屏幕的中心。 我可以在垂直和水平方向上操作视野,但是我不能做的是从中心移动视点视图,以便我可以看到15度上下30度,而我的眼睛指向屏幕上的点位于视口顶部的1/3处。 下面是我想要实现的图像,假设眼睛在海平面上直视地平线。 我尝试了几种技巧,我试图按比例放大视口,然后增加FOVY,然后将视口夹在45度视角,然后我试着操纵相机,看下去15度,但结果都不令人满意,因为我的3D世界观的视界从来没有在15度上下30度的范围内,这是我的要求 我想正确的方法是定义正确的平截头体。 请确认是这种情况,以及如何设置它:假设:FOV = 64 FOVY = 45比例1:5近平面= 1远= 500000000.0