Opengl ES - неправильный рендеринг по оси z? - PullRequest
3 голосов
/ 19 мая 2009

У меня есть модель снеговика, которую я загружаю из файла .obj. Все работает хорошо, за исключением того, что когда я использую glRotatef (), чтобы вращать модель, голова снеговика всегда будет отображаться перед телом. Нос снеговика также всегда будет отображаться за головой. Это создает эффект того, что снеговик меняет направление при вращении, но на самом деле части просто не отображаются в правильном z-порядке. Почему это происходит?

ПРИМЕЧАНИЕ: все части снеговика взяты из одного файла .obj, созданного с помощью blender.

рендеринг модели следующим образом (в цикле рисования)

glVertexPointer(3 ,GL_FLOAT, 0, model_verts);
glEnableClientState(GL_NORMAL_ARRAY);
glNormalPointer(GL_FLOAT, 0, model_normals);
glDrawElements(GL_TRIANGLES, num_model_indices*3, GL_UNSIGNED_SHORT, &model_indices);

вращается вот так (в касаниях)

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
 UITouch *touch = [touches anyObject];
 touchBeginPos = [touch locationInView:self];

}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
 CGPoint touchEndPos = [[touches anyObject] locationInView:self];
 glMatrixMode(GL_MODELVIEW_MATRIX);
 glRotatef(10, (touchBeginPos.y - touchEndPos.y)/4, -(touchBeginPos.x - touchEndPos.x)/4, 0.0f);
 touchBeginPos = touchEndPos;
}

Ответы [ 2 ]

5 голосов
/ 19 мая 2009

Убедитесь, что вы не (по ошибке) не применили отрицательную (зеркальную) шкалу к сцене. Также убедитесь, что вы используете Z-буферизацию, возможно, нет.

На этой странице немного рассказывается о системе координат Blender, по сравнению с другой 3D-системой, и, возможно, в качестве эталона она почти неясна, но я придаю ей определенную степень уверенности.

0 голосов
/ 03 июня 2010

UIKit координаты для текстур в обратном порядке, поэтому у вас есть два варианта:

  1. настроить V координаты ваших текстурных отображений на (1-vcoord)
  2. переверните изображение перед тем, как рисовать в контекст, который вы позже загрузите в gl.

Если вы используете CG для загрузки таких текстур, вы можете добавить ScaleCTM:

CGContextRef context = CGBitmapContextCreate( imageData, ....
CGContextClearRect( context, ...
CGContextScaleCTM( context, 1.0, -1.0);  // flip the texture vertically
CGContextDrawImage( context, CGRectMake( 0, 0, width, height ), image.CGImage );
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...