3d движение вокруг сферы - PullRequest
1 голос
/ 17 января 2011

Я работаю в 3d впервые за долгое время. По сути, я вращаю сферу и проецирую шнуры x y z, чтобы разместить предметы на поверхности, основываясь на вращении сфер X и Y.

Вот код, который я использую:

    #define piover180 0.01745329252f

    GLfloat cosy = cos(yrot * piover180);

    island[i].x = rad * sin(xrot * piover180)* cosy;
    island[i].y = rad * sin(yrot * piover180);
    island[i].z = rad * cos(xrot * piover180) * cosy;

Проблема в том, что позиционирование Xrot работает нормально, но размещение Yrot всегда рисует объекты на северном и южном полюсе, поэтому они все пересекаются наверху, что не подходит для вращения. Мне нужен способ решить это. Вот картинка, чтобы помочь объяснить:

Screenshot

Любая помощь будет принята с благодарностью, дайте мне знать, если вам нужна дополнительная информация?

Ответы [ 2 ]

2 голосов
/ 17 января 2011

Пример кода, который вы вставили, неполон, потому что вы не показали, как вы применяли эти вычисления через glRotate et al. Вот как бы я это сделал. Хотя вы, безусловно, могли бы оптимизировать его, выполнив матричные вычисления самостоятельно за один шаг, это, вероятно, не является необходимым.

// Move object out to its radius
glTranslatef(radius, 0, 0);

// Apply latitudinal rotation (aka "Yrot")
glRotatef(latitude, 0, 1, 0);

// Apply longitudinal rotation (aka "Xrot")
glRotatef(longitude, 0, 0, 1);

После этого вы можете сделать рисунок. Вы также захотите обернуть все это в вызовы к glPushMatrix и glPopMatrix, чтобы изолировать это преобразование.

0 голосов
/ 18 января 2011

В итоге я решил ее с помощью Сферической системы координат.

Вот код:

island[i].x = rad*sin(xrot*(PI/180))*cos(yrot*(PI/180));
island[i].y = rad*sin(xrot*(PI/180))*sin(yrot*(PI/180));
island[i].z = cos(xrot*(PI/180));

Вот уравнения:

x = r sinq cosf
y = r sinq sinf
z = r cosq

r = (x2 + y2 + z2)1/2
q = tan-1(z/(x2+y2)1/2)
f = tan-1(y/x)

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

Ссылка: http://electron9.phys.utk.edu/vectors/3dcoordinates.htm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...