4

私は簡単なプログラムを持っています、それは円を描きます:/これはうまくいきます...

for (k = 1; k < n+1+1; k++){
 vertices[k].color = GU_COLOR( 0.0f, 0.0f, 1.0f, 0.0f );
 vertices[k].x = cos_d( 360 - ((k-1) * dstep) );
 vertices[k].y = sin_d( 360 - ((k-1) * dstep) );
 vertices[k].z = 0.0f;
}
...
//Now draw it
sceGumDrawArray(GU_TRIANGLE_FAN, GU_COLOR_8888|GU_VERTEX_32BITF|GU_TRANSFORM_3D, n+1+1, 0, vertices);

しかし、これはしません:

for (k = 1; k < n+1+1; k++){
 vertices[k].color = GU_COLOR( 0.0f, 0.0f, 1.0f, 0.0f );
 vertices[k].x = cos_d( ((k-1) * dstep) );
 vertices[k].y = sin_d( ((k-1) * dstep) );
 vertices[k].z = 0.0f;
}

しかし、これは同じであってはなりません - 最初のループが頂点を時計回りに計算し、2 番目のループが反時計回りに計算するという違いがありますか? 2番目の例を使用して頂点を描画しないのは厄介です...

それとも私は愚かですか?

4

4 に答える 4

6

裏面カリングにより描画されない場合があります。

「ユーザーが正面向きのポリゴンが時計回りに曲がっていることを指定した場合、画面に投影されたポリゴンが反時計回りに曲がっていると、カメラとは反対の方向に回転し、描画されません。」

于 2010-08-02T20:40:47.650 に答える
2

円をどのように描いているのかよくわかりません (頂点のリストを作成しているのを見ますが、それらのレンダリングについては何も知りません)。

通常、時計回りから反時計回りに反転すると、通常の反転になります。つまり、円の裏側を見ていることになります。そして、ほとんどの API の場合と同様に、(ボリュームのない) 何かの背面を見ると、レンダリングされません。

これはバックフェースカリングと呼ばれます。

于 2010-08-02T20:40:27.743 に答える
0

使用しているライブラリはわかりませんが、コードにラジアンと度が混在していませんか? sin関数とcos関数はラジアンと度のどちらを取りますか?

于 2010-08-02T20:38:46.930 に答える
0

おそらくdstep360/nですか?

審美的なポイントとして、GL_TRIANGLE_FANおそらく最初のポイントを円の中心にしたいと思うでしょう。

于 2010-08-02T20:43:53.463 に答える