3

.obj ファイルから読み込んでいる雪だるまのモデルがあります。glRotatef() を使用してモデルを回転させると、雪だるまの頭が常に体の前にレンダリングされることを除いて、すべてがうまく機能します。雪だるまの鼻も常に頭の後ろにレンダリングされます。これにより、雪だるまが回転しながら方向を変える効果が生まれますが、実際にはパーツが正しい z オーダーでレンダリングされません。なぜこれが起こっているのですか?

注: 雪だるまのすべてのパーツは、blender を使用して作成された同じ .obj ファイルからのものです。

このようにモデルをレンダリングします(描画ループ内)

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);

このように回転します (in touchesMoved)

- (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;
}
4

2 に答える 2

5

(誤って) 負の (ミラーリング) スケールをシーンに適用していないことを確認してください。また、Z バッファリングを使用していることも確認してください。使用していない可能性があります。

このページでは、別の 3D システムと比較して、Blender の座標系について少し説明していますが、参照としてはあまり知られていないかもしれませんが、私はある程度の信頼を置いています。

于 2009-05-19T13:07:08.753 に答える
0

テクスチャのUIKit座標は逆さまであるため、次の2つのオプションがあります。

  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);
于 2010-06-03T06:13:59.013 に答える