gpt4 book ai didi

Android 和 OpenGL - 通过另一个对象查看对象

转载 作者:搜寻专家 更新时间:2023-11-01 08:16:09 26 4
gpt4 key购买 nike

我完全是菜鸟,我想展示我在 opengl (Blender) 的 3D 建模程序中构建的小型潜艇。

这艘潜艇是用一个长圆柱体 build 的,圆柱体的末端有一个相交的球体。

我遇到的问题是,当我查看结果时,我可以透过圆柱体看到整个球体。我还可以通过球体看到圆柱体的末端。这在我打开照明时出现。我正在使用环境光和漫射光。我只想看到圆柱体外面的一半球体,不想看到任何内部结构。

我启用了面部剔除,它移除了两个物体的正面,但我清楚地看到了球体。

下面我粘贴了我的 onSurfaceCreated 函数,我在其中设置了所有 opengl 参数。任何建议表示赞赏!

@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
//
gl.glEnable(GL10.GL_DEPTH_TEST);
//gl.glMatrixMode(GL10.GL_PROJECTION);

gl.glMatrixMode(GL10.GL_MODELVIEW);

gl.glEnable(GL10.GL_POLYGON_OFFSET_FILL);

gl.glEnable(GL10.GL_LIGHTING);
gl.glEnable(GL10.GL_LIGHT0);

// Define the ambient component of the first light
float[] light0Ambient = {0.1f, 0.1f, 0.1f, 1.0f};
gl.glLightfv(gl.GL_LIGHT0, gl.GL_AMBIENT, FloatBufferFromFloatArray(light0Ambient, 4));

// Define the diffuse component of the first light
float[] light0Diffuse = {0.7f, 0.7f, 0.7f, 1.0f};
gl.glLightfv(gl.GL_LIGHT0, gl.GL_DIFFUSE, FloatBufferFromFloatArray(light0Diffuse, 4));

// Define the specular component and shininess of the first light
float[] light0Specular = {0.7f, 0.7f, 0.7f, 1.0f};
float light0Shininess = 0.4f;
//gl.glLightfv(gl.GL_LIGHT0, gl.GL_SPECULAR, FloatBufferFromFloatArray(light0Specular, 4));

// Define the position of the first light
float[] light0Position = {1.0f, 0.0f, 0.0f, 0.0f};
gl.glLightfv(gl.GL_LIGHT0, gl.GL_POSITION, FloatBufferFromFloatArray(light0Position, 4));

// Define a direction vector for the light, this one points correct down the Z axis
float[] light0Direction = {0.0f, 0.0f, -1.0f};
//gl.glLightfv(gl.GL_LIGHT0, gl.GL_SPOT_DIRECTION, FloatBufferFromFloatArray(light0Direction, 3));

// Define a cutoff angle. This defines a 90° field of vision, since the cutoff
// is number of degrees to each side of an imaginary line drawn from the light's
// position along the vector supplied in GL_SPOT_DIRECTION above
//gl.glLightf(gl.GL_LIGHT0, gl.GL_SPOT_CUTOFF, 180.0f);

gl.glEnable(GL10.GL_CULL_FACE);
// which is the front? the one which is drawn counter clockwise
gl.glFrontFace(GL10.GL_CCW);
// which one should NOT be drawn
gl.glCullFace(GL10.GL_BACK);

gl.glClearDepthf(10f);
gl.glPolygonOffset(1.0f, 2);

initShape();

gl.glScalef(0.5f, 0.5f, 0.5f);
}

最佳答案

您是否尝试检查它是否是背面剔除问题?通过将 glEnable(GL_CULL_FACE) 更改为 glDisable 来检查它,只是为了检查它绝对不是那样。在同一个网格上可能有两种缠绕顺序,因此剔除对于模型的一部分可能是正确的,但对于另一部分是错误的 - 最简单的方法是禁用它以确保这不是问题所在。

要么是因为某些原因,要么您的表面创建时没有深度缓冲区?检查 EGLConfig 参数以确保不是这种情况。通常它会默认使用深度缓冲区创建,但可以覆盖该行为。

此外,使用永远不会被看到的内部面孔对事物进行建模不会对您的实时性能有好处。您应该考虑在 Blender 中使用 bool “或”操作,至少可以摆脱内部面孔,但最终最好在制作模型时非常小心并注意它们的拓扑结构,不仅是多边形数量,还有它们的好坏组合成一个三角形带(这不能成为你现在遇到的问题的借口 - 这只是 future 的一个注意事项)

关于Android 和 OpenGL - 通过另一个对象查看对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4641966/

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