gpt4 book ai didi

delphi - 我需要从当前OpenGL状态计算可见空间的边缘

转载 作者:行者123 更新时间:2023-12-03 18:44:27 24 4
gpt4 key购买 nike

在Delphi中的OpenGL中,我试图通过在正交投影中找到查看区域的左,右,顶部和底部范围来计算可查看的场景数量。这将使某些鼠标交互似乎是一对一的。我没有太多访问建立正交投影矩阵的代码,但是我知道它调用glOrtho(...)来建立投影矩阵。

我需要能够采用笛卡尔平面(而不是渲染的多边形平面),然后根据opengl可以提供的任何信息来计算视锥的左,右,上和下边缘(我不在乎正面和背面)剪裁飞机)。我无权访问设置查看量的代码(使用DelSl的glScene库),因此,据我所知,唯一可以用来查找此信息的信息是

glGet(GL_PROJECTION_MATRIX, @projectionMatrix);


根据 http://www.talisman.org/opengl-1.1/Reference/glOrtho.html中的文档,我决定可以进行一些数学计算来计算近平面的左,右,顶部和底部范围(在正交模式下足够)(请参见下面的代码)。但是,当我实际查看从glGet检索到的值时,会看到一个矩阵,其值与我上面给出的文档链接中的描述不符(请参阅下面的矩阵数据)。有了如此令人失望的数字,我怀疑我是否可以正确使用glGet,以及我是否真的可以依靠这些数字为我提供可见体积的左/右/上/下范围。我想我也可能在Delphi中犯了一个错误,但是我不知道会是什么。

在此特定情况下,平面定向为直接面对相机,并且相机具有正交投影。我无法完全控制投影矩阵的设置方式,所以我希望我可以将左边缘计算为

 left = 2 / (A * (tx - 1)/(tx+1) - 1)


从投影矩阵检索A和tx的位置,如 http://www.talisman.org/opengl-1.1/Reference/glOrtho.html所示(我没有显示我如何推导上面的公式,所以它可能是不正确的-现在它给出了-INF的答案)。
我用来检索投影矩阵值的代码如下:

var
projectionMatrix: TMatrix;
Left, Right, Top, Bottom: Single;
A, B, C, tx, ty, tz: Single;
begin
A := projectionMatrix[0][0];
B := projectionMatrix[1][1];
C := projectionMatrix[2][2];
tx := projectionMatrix[0][3];
ty := projectionMatrix[1][3];
tz := projectionMatrix[2][3];

Left := 2 / (A * ((tx - 1) / (tx + 1) - 1));
ShowMessage(FloatToStr(A));
//etc...


我看到的矩阵值大约是这样的:

[0] (0, 1.7436188636e-39, 6.4310754487e+37, 1.3822464104e-39)
[1] (3.8535707769e-43, 1.4012984643e-45, 0, 2.8086960027e+32)
[2] (-4.20345941e+17, 0, 1.7437029415e-39, 2.8086960027e+32)
[3] (1.7437645986e-39, 6.4311900443e+37, +NAN, 1.7437645986e-39)


[编辑]
glScene具有以下声明:

TMatrix = THomogeneousFltMatrix; 
THomogeneousFltMatrix = TMatrix4f;
TMatrix4f = array[0..3] of TVector4f;
TVector4f = array[0..3] of single;


[编辑]
如果将投影矩阵更改为16值数组,则会发生以下情况:

var      
projectionMatrix, modelviewMatrix: array[0..16] of single;
begin
...
glGetFloatv(GL_PROJECTION_MATRIX, @projectionMatrix);
...


结果数组是元素0到16,看起来仍然不正确。


projectionMatrix(5.9208279286e-39,
-1536643072,1.2429653406,-1.2128044229e-11,2.8763115406,0,4.728515625,1.7430022923e-39,6.5138089186e + 37,-3.7955583126e + 30,-2.4000201225,-3.7955583126e + 30,2.4000201225,-1.2128044229e-11, 2.6263115406,-1.2128044229e-11,-2.6263115406)

最佳答案

您似乎在使用glScene。为什么不使用TGLSceneBuffer.ScreenVectorIntersectWithPlane()?

您从4个屏幕坐标中获得4个世界向量,并且有一个矩形,您可以轻松计算出该区域的面积。

关于delphi - 我需要从当前OpenGL状态计算可见空间的边缘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1034474/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com