相关疑难解决方法(0)

OpenGL Math - 为世界空间坐标投影屏幕空间

是时候进行一些数学计算了...

我需要预测窗口大小的4个点:

<0,0> <1024,768>

进入一个世界空间坐标,它将形成一个四边形的形状,以后将用于地形剔除 - 没有GluUnproject

仅供测试,我使用鼠标坐标 - 并尝试将它们投射到世界坐标上

opengl math matrix

15
推荐指数
3
解决办法
3万
查看次数

如何在片段着色器中使用gl_FragCoord.z在现代OpenGL中线性渲染深度?

我阅读了很多关于使用片段着色器获取深度的信息.

http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=234519

但我还是不知道这是否gl_FragCoord.z是线性的.

GLSL规范称屏幕上的范围为[0,1]而未提及线性与否.

我认为线性是至关重要的,因为我将使用渲染模型来匹配Kinect的深度图.

那么如果它不是线性的,那么如何在世界空间中线性化呢?

opengl shader glsl depth-buffer depth

9
推荐指数
3
解决办法
9822
查看次数

如何在给定视图空间深度值和ndc xy的情况下恢复视图空间位置

我正在写一个延迟着色器,我正试图更紧密地收拾我的gbuffer.但是,我似乎无法正确计算视图空间深度的视图位置

// depth -> (gl_ModelViewMatrix * vec4(pos.xyz, 1)).z; where pos is the model space position
// fov -> field of view in radians (0.62831855, 0.47123888)
// p -> ndc position, x, y [-1, 1]
vec3 getPosition(float depth, vec2 fov, vec2 p)
{
vec3 pos;
pos.x = -depth * tan( HALF_PI - fov.x/2.0 ) * (p.x);
pos.y = -depth * tan( HALF_PI - fov.y/2.0 ) * (p.y);
pos.z = depth;
return pos;
}
Run Code Online (Sandbox Code Playgroud)

计算出的位置是错误的.我知道这是因为我仍然在gbuffer中存储正确的位置并使用它进行测试.

c++ glsl perspectivecamera coordinate-transformation

7
推荐指数
2
解决办法
3743
查看次数

如何计算给定坐标处相机可见的矩形的大小?

我制作了一个小 Three.js 应用程序,它将一堆圆圈从画布底部移动到顶部:

let renderer, scene, light, circles, camera;

initialize();
animate();

function initialize() {
  renderer = new THREE.WebGLRenderer({ alpha: true, antialias: true });
  renderer.setSize(window.innerWidth, window.innerHeight);
  document.body.appendChild(renderer.domElement);

  scene = new THREE.Scene();

  light = new THREE.AmbientLight();
  scene.add(light);

  circles = new THREE.Group();
  scene.add(circles);

  camera = new THREE.PerspectiveCamera(45, renderer.domElement.clientWidth / renderer.domElement.clientHeight, 1);
  camera.position.z = circles.position.z + 500;
}


function animate() {
  // Update each circle.
  Array.from(circles.children).forEach(circle => {
    if (circle.position.y < visibleBox(circle.position.z).max.y) {
      circle.position.y += 4;
    } else {
      circles.remove(circle);
    }
  });

  // Create …
Run Code Online (Sandbox Code Playgroud)

javascript frustum perspectivecamera three.js

4
推荐指数
1
解决办法
1588
查看次数

在three.js中将z位置从透视转换为正交相机

我有一个场景,我想将透视对象(即远离时看起来较小的对象)与正交对象(即,无论距离如何都显示相同大小的对象)结合起来。透视对象是渲染“世界”的一部分,而正交对象是装饰品,如标签或图标。与 HUD 不同的是,我希望正交对象在世界“内部”渲染,这意味着它们可以被世界对象覆盖(想象一下在标签之前经过的平面)。

我的解决办法是使用一个渲染器,但两个场景,一个具有PerspectiveCamera和一个带OrthogographicCamera。我在不清除 z 缓冲区的情况下按顺序渲染它们(渲染器的autoClear属性设置为false)。我面临的问题是,我需要同步每个场景中对象的放置,以便为一个场景中的对象分配一个 z 位置,该位置位于另一个场景中位于它之前的对象之后,但位于其之前的对象之前在它后面。

为此,我将我的透视场景指定为“领先”场景,即。所有对象的所有坐标(透视和正交)都是基于这个场景分配的。透视对象直接使用这些坐标并在该场景中使用透视相机进行渲染。正交对象的坐标被转换为正交场景中的坐标,然后使用正交相机在该场景中渲染。我通过将透视场景中的坐标投影到透视相机的视图窗格,然后使用正交相机返回到正交场景来进行转换:

position.project(perspectiveCamera).unproject(orthogographicCamera);
Run Code Online (Sandbox Code Playgroud)

唉,这并不像预期的那样工作。正交对象总是在透视对象之前渲染,即使它们应该在它们之间。考虑这个例子,其中蓝色圆圈应该显示红色方块后面,但绿色方块之前(它不是):

var pScene = new THREE.Scene();
var oScene = new THREE.Scene();

var pCam = new THREE.PerspectiveCamera(40, window.innerWidth / window.innerHeight, 1, 1000);
pCam.position.set(0, 40, 50);
pCam.lookAt(new THREE.Vector3(0, 0, -50));

var oCam = new THREE.OrthographicCamera(window.innerWidth / -2, window.innerWidth / 2, window.innerHeight / 2, window.innerHeight / -2, 1, 500);
oCam.Position = pCam.position.clone();

pScene.add(pCam);
pScene.add(new THREE.AmbientLight(0xFFFFFF)); …
Run Code Online (Sandbox Code Playgroud)

javascript camera projection coordinate-transformation three.js

3
推荐指数
1
解决办法
4008
查看次数

透视投影和视图矩阵:OpenGL中的深度缓冲和三角面朝向都相反

我在OpenGL中遇到麻烦.应该更远的物体被拉得更近等等,正面朝向的三角形被剔除而不是朝后的三角形.它们以正确的方向绘制,因为它是我之前使用过的包.我确信它与我的投影或veiwModel矩阵有关.虽然我看不出有什么问题!

AV4X4FLOAT formProjMatrix(float FOVangle,float aspect,float nearz,float farz)
{
    AV4X4FLOAT A;

    A.m[0] = 1/(aspect*tanf(FOVangle/2));
    A.m[5] = 1/tanf(FOVangle/2);
    A.m[10] = farz/(farz-nearz);
    A.m[11] = -nearz*farz/(farz-nearz);
    A.m[14] = 1;
    return A;
}
Run Code Online (Sandbox Code Playgroud)

AV4X4FLOAT formViewModelMatrix(AV4FLOAT pos,AV4FLOAT target,AV4FLOAT up)
{ 
    AV4X4FLOAT M;
    AV4X4FLOAT R;
    AV4FLOAT u;
    AV4FLOAT v;
    AV4FLOAT W;

    W.x = -pos.x + target.x;
    W.y = -pos.y + target.y;
    W.z = -pos.z + target.z;

    W.w = 0;
    W.normalize();

    u.x = up.y*W.z-W.y*up.z;
    u.y = -up.x*W.z+W.x*up.z;
    u.z = up.x*W.y-W.x*up.y;
    u.w = 0;
    u.normalize();

    v.x = W.y*u.z-u.y*W.z;
    v.y …
Run Code Online (Sandbox Code Playgroud)

c++ opengl perspectivecamera

1
推荐指数
1
解决办法
586
查看次数

变换模型矩阵

使用 glm 设置 ViewMatrix 很容易:

glm::lookAt(Position, Direction, UpVector);
Run Code Online (Sandbox Code Playgroud)

但是如果我尝试将 funktion 与 modelMatrix 一起使用,我会得到令人困惑的值(模型的位置不正确,而且旋转看起来也不正确)。我只想以与设置相机相同的方式设置对象。我可以使用 lookAt 功能并在之后进行一些更改吗?还是我必须为此编写自己的功能?如果是这样,如何?

我用这个固定了位置:

m_Orientation = glm::lookAtLH(Position, Direction, UpVector);
m_Orientation[3][0] = -m_Orientation[3][0];
m_Orientation[3][1] = -m_Orientation[3][1];
m_Orientation[3][2] = -m_Orientation[3][2];
Run Code Online (Sandbox Code Playgroud)

也在 vertexshader 里面我用这个:

gl_Position = CameraMatrix * ModelMatrix * Pos;
Run Code Online (Sandbox Code Playgroud)

其中 CameraMatrix 是一个 viewProjectionMatrix,ModelMatrix(我的问题)和 Pos 是我的顶点在模型空间中的位置

c++ opengl coordinate-transformation glm-math

0
推荐指数
1
解决办法
1999
查看次数