2

私は3Dで球を持っています。実行時に、動的な 2048x1024 テクスチャを生成しています。このテクスチャには、どこにでもある小さな円が描かれています。テクスチャ上にこの円の x/y があり、その結果、対応する UV 座標があります。ここで、この小さな円が球体のどこにあるかを正確に補間したいと思います。

これは私が使用してきたコードですが、常に +/-90 度ずれているようです。

// U, V are original UV obtained from dynamic texture.

_u =  Math.PI * U;  
_v =  -2 * Math.PI * V;

_x = Math.cos(_u) * Math.sin(_v) * radius;
_y = Math.sin(_u) * Math.sin(_v) * radius;
_z = Math.cos(_v) * radius;

助けてくれてありがとう!

4

3 に答える 3

2

コメントに投稿したコードによると、X、Y、Z の値を生成する方法は次のとおりです。

theta = 2 * PI * U;
phi = PI * V;

_x = Math.cos(theta) * Math.sin(phi) * radius;
_y = Math.sin(theta) * Math.sin(phi) * radius;
_z = -Math.cos(phi) * radius;

古い答え:

あなたのコードは問題ありません。球が同じ方法で生成され、極がそのように Z 軸に沿っていることは確かですか? 「通常」球体は、極が Y 軸に沿って生成されます。これをチェックして。

それ以外の場合、常に +/- 90° ずれている場合は、x と y を定義する sin と cos をいじってみてください。例えば:

_x = -Math.sin(_u) * Math.sin(_v) * radius;
_y = Math.cos(_u) * Math.sin(_v) * radius;

オリジナルの90°回転です。

これら 2 つのコンポーネントのサイン/コサインをさまざまな符号で実行できる 8 つの異なる方法があります。球体がどのように生成されるかを知らなければ、それらをすべて試してみる必要があります。彼らが行く

(x = sin(u), y = cos(u));
(x = sin(u), y = -cos(u));
(x = -sin(u), y = cos(u));
(x = -sin(u), y = -cos(u));

(x = cos(u), y = sin(u));
(x = cos(u), y = -sin(u));
(x = -cos(u), y = sin(u));
(x = -cos(u), y = -sin(u));

ただし、これは面倒でハックです。球体がどのように生成されるかを調べてみることを強くお勧めします。通常、U と V をループして x、y、z 位置を生成します。

于 2011-10-20T18:48:42.650 に答える
0

球を生成するために使用する式は、極を Z 軸として扱っています。GLUT のようなものを使用している場合、デフォルトの座標系は Z プラス画面の法線であり、「上」が Y 軸です。ZとYを交換するとうまくいくかもしれません。似たようなことをやり終えたばかりで、結果に満足しています。

以下を使用しました。

double theta = ((2 * PI) / lWidth) * u;
double phi = (PI / lHeight) * v;

double dX = std::cos(theta) * std::sin(phi) * radius;
double dZ = std::sin(theta) * std::sin(phi) * radius;
double dY = std::cos(phi) * radius;

lWidth と lHeight は、球体にマッピングしたビットマップの寸法です。

于 2015-10-09T00:41:00.290 に答える
0

適切な軸が定義されていることを確認してください。

ENU - 東北上 NED - 北東下

通常、NED と ENU の変換は異なります。これは、方位角が同じように定義されているためです。つまり、北に対して時計回りです。

それぞれのシータで 90- を実行するか、共角規則を使用します。

自分で数式を導出してみてください..どのような規則が使用されているかを確認してください

于 2011-10-31T07:20:58.003 に答える