我正在开发一个iPad应用程序,它只是绘制一个3d立方体。用户可以通过手指运动来旋转它,并可以通过挤压它来放大/缩小它。
现在我同时给整个立方体(每个表面)上色。现在,如果我想让用户分别给立方体的每个表面着色,这意味着用户将点击一个表面,它将只给该表面着色,但我不知道如何识别用户点击的表面。
我正在使用简单的openGL基础知识绘制整个立方体,如下所示。
static const GLfloat cubeVertices[] = {
-1.0, -1.0, 1.0,
1.0, -1.0, 1.0,
1.0, 1.0, 1.0,
-1.0, 1.0, 1.0,
-1.0, -1.0, -1.0,
1.0, -1.0, -1.0,
1.0, 1.0, -1.0,
-1.0, 1.0, -1.0,
};
static const GLushort cubeIndicesFaceFront[] = {
0, 1, 2, 3, 0
};
static const GLushort cubeIndicesFaceBack[] = {
4, 5, 6, 7, 4
};
static const GLushort cubeIndicesFaceLeft[] = {
0, 4, 7, 3, 0
};
static const GLushort cubeIndicesFaceRight[] = {
1, 5, 6, 2, 1
};
static const GLushort cubeIndicesFaceTop[] = {
3, 2, 6, 7, 3
};
static const GLushort cubeIndicesFaceBottom[] = {
0, 1, 5, 4, 0
};
static const GLubyte cubeColors[] = {
0, 255, 255, 255,
0, 255, 255, 255,
0, 255, 255, 255,
0, 255, 255, 255,
0, 255, 255, 255,
};
glVertexPointer(3, GL_FLOAT, 0, cubeVertices);
glEnableClientState(GL_VERTEX_ARRAY);
glColorPointer(4, GL_UNSIGNED_BYTE, 0, cubeColors);
glEnableClientState(GL_COLOR_ARRAY);
glDrawElements(GL_TRIANGLE_FAN, 5, GL_UNSIGNED_SHORT, cubeIndicesFaceFront);
glDrawElements(GL_TRIANGLE_FAN, 5, GL_UNSIGNED_SHORT, cubeIndicesFaceBack);
glDrawElements(GL_TRIANGLE_FAN, 5, GL_UNSIGNED_SHORT, cubeIndicesFaceLeft);
glDrawElements(GL_TRIANGLE_FAN, 5, GL_UNSIGNED_SHORT, cubeIndicesFaceRight);
glDrawElements(GL_TRIANGLE_FAN, 5, GL_UNSIGNED_SHORT, cubeIndicesFaceTop);
glDrawElements(GL_TRIANGLE_FAN, 5, GL_UNSIGNED_SHORT, cubeIndicesFaceBottom);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER_OES];在advance....appreciated中感谢您的支持。
发布于 2010-07-21 17:37:10
此页包含有关选择曲面的有用信息:http://www.opengl.org/resources/faq/technical/selection.htm
发布于 2010-07-21 17:36:33
您需要在用户单击的点所定义的直线与视图方向和立方体之间执行交点。
您可以忽略所有指向与视图方向相同的面(即远离您),而只看那些指向您的面。如果你做面部法线和光线的点积,当指向你时,它将是负的,而当指向远离时,它将是正的。如果它是零(在舍入误差范围内),那么你正在看的是面的边缘。
这可以称为光线投射。
https://stackoverflow.com/questions/3297892
复制相似问题