gpt4 book ai didi

ios - 将 iOS OpenGL ES 应用程序中的所有点居中

转载 作者:行者123 更新时间:2023-11-29 02:56:20 26 4
gpt4 key购买 nike

我有一个 OpenGL View ,它显示一组带有一些基本着色器的 3D 点:

// Fragment Shader

static const char* PointFS = STRINGIFY
(

void main(void)
{
gl_FragColor = vec4(0.8, 0.8, 0.8, 1.0);
}

);

// Vertex Shader

static const char* PointVS = STRINGIFY
(
uniform mediump mat4 uProjectionMatrix;

attribute mediump vec4 position;

void main( void )
{
gl_Position = uProjectionMatrix * position;
gl_PointSize = 3.0;
}

);

MVP矩阵计算如下:

- (void)setMatrices
{
// ModelView Matrix
GLKMatrix4 modelViewMatrix = GLKMatrix4Identity;
modelViewMatrix = GLKMatrix4Scale(modelViewMatrix, 2, 2, 2);

// Projection Matrix
const GLfloat aspectRatio = (GLfloat)(self.view.bounds.size.width) / (GLfloat)(self.view.bounds.size.height);
const GLfloat fieldView = GLKMathDegreesToRadians(90.0f);
const GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(fieldView, aspectRatio, 0.1f, 10.0f);

glUniformMatrix4fv(self.pointShader.uProjectionMatrix, 1, 0, GLKMatrix4Multiply(projectionMatrix, modelViewMatrix).m);
}

这工作正常,但是我有一组 500 个点,但我只看到了一些

如何缩放/平移 MVP 矩阵以显示所有这些(它们是动态集)?理想情况下,“质心”应位于原点,并且所有点都可见。它应该能够适应 View 的旋转(手势是我想要实现的下一步)。

最佳答案

看看你如何展示这个,你可能需要很多...我想最好的方法可能是使用“看”,你正在看的点是 (0,0,0)正如你所说,相机位置可能应该是 (0,0,Z)及以上 (0,1,0) .所以这里唯一的问题是相机位置的 Z 分量。

如果您以 Z 开头,例如 -.1然后迭代所有点 sin(fieldView*.5f) * (p.z-Z) >= point.y使该点可见。所以你可以计算Z1 = p.z-(point.y/sin(fieldView*.5f))如果Z1<Z然后 Z=Z1 .此检查仅适用于正 Y 检查,负 Y 和 +-X 也需要相同的检查。这些规避非常相似,尽管在检查 X 时您也可以考虑屏幕比例。

此过程应该为您提供尽可能小的视野以查看所有点(具有给定的限制,例如朝向 (0,0,0)),但远非最简单。如果p.z<-Z,您还需要考虑方程式是否有效。 .

另一种更简单的方法是围绕中心生成包含所有点的最小立方体:遍历点并获得具有最大绝对值(X、Y 或 Z 中的任何一个)的坐标。当您将它与 frustum 一起使用而不是 perspective 时,所有矩形参数(顶部、底部、左侧和右侧)都将使用此值生成 +-largest .然后你需要计算 90 度场的翻译是 Z = (largest*.5) . Z 是平截头体的 zNear,然后也将矩阵平移 -(Z+largest) .同样,截锥体中的坐标之一必须乘以屏幕比例。

无论如何请注意您的 zFar是的,只有 10.0f 在你的情况下可能有点太短了。在您需要深度缓冲区之前,您不必担心该值太大。

关于ios - 将 iOS OpenGL ES 应用程序中的所有点居中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23862100/

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