определить поверхность 3d куба - PullRequest
0 голосов
/ 21 июля 2010

Я занимаюсь разработкой приложения для 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];

Заранее спасибо .... ценил вашу поддержку.

Ответы [ 2 ]

1 голос
/ 21 июля 2010

Эта страница содержит полезную информацию о выборе поверхностей: http://www.opengl.org/resources/faq/technical/selection.htm

0 голосов
/ 21 июля 2010

Необходимо выполнить пересечение между линией, определяемой точкой, которую пользователь нажимает, и направлением вида и кубом.

Вы можете сбрасывать со счетов все лица, которые указывают в том же направлении, что и направление обзора (то есть от вас), и смотреть только на те, которые указывают на вас. Если вы сделаете точечное произведение лица нормальным, и луч будет отрицательным, если он направлен на вас, и положительным, если он направлен в сторону. Если оно равно нулю (в пределах ошибки округления), значит, вы смотрите на грань грани.

Это можно назвать лучей.

...