テクスチャ画像座標に基づいて球の内側に曲線メッシュを作成する


8

ブレンダーでは、内部にパノラマテクスチャを持つ球を作成しました。また、別のテクスチャを描画できる内壁に位置する平面メッシュ(球のサイズに一致するように湾曲した)を手動で作成しました。

これは素晴らしいですが、手作業を減らし、スクリプトでこの作業の一部を実行したいと思います。たとえば、パノラマ画像用の変数や、新しいものと置き換えたい写真の領域の座標を持っているようなものですメッシュ。

これを行う際の最も難しい部分は、球の内壁に配置できるコードで曲線メッシュを作成することです。

誰かが私を正しい方向に向けることができますか?


少ない労力で何が起こりたいかについて詳しく説明できますか?現在の方法と最終結果を詳しく説明してください。
セスバッティン

また、これらの2つのメッシュが相互作用する必要があるのはなぜですか?内側のメッシュのサイズと座標を指定して、必要な場所に描画できますか?なぜそれを外球に関して指定する必要があるのですか?
セスバッティン

正四角形の画像を球の内側にマッピングし、長方形の額縁(画像内)に動的画像を含めることができるようにしたいと考えています。ただし、新しい正距円筒イメージを導入するたびに、すべてを一から作り直したくありません。簡単にするために、平坦化したイメージを取得し、フォトショップなどを使用して額縁のxy座標、およびそれらの2d座標に対応する球に縮小ラップされた新しいメッシュがあります。
user5025 2013

Unityがスカイボックスをサポートしていることをご存知ですか?それがあなたが達成しようとしていることのように思えます。
MichaelHouse

スカイボックスは知っていますが、残念ながら問題は解決しません。正距円筒画像の額縁の座標に基づいて、(球の内側に完全に収まる)湾曲したメッシュを作成する方法が必要です。
user5025 2013

回答:


0

あなたが達成しようとしていることはこれに非常に関連しているようです:

n次元の球座標の類似体

あなたの場合は2次元で、あなたはこの式を使ってあなたが持っている長方形の頂点を球にマッピングします(それが細分されることを期待しましょう)。まともな人は直径を使用しています...)

編集:これはすべて漠然としているので、私はいくつかのより多くの洞察を与えます使用するためにこの式から必要なもの:

x = r*sinθ*cosφ
y = r*sinθ*sinφ
z = r*cosθ

θとφは、パノラマ画像の一部にあるポイントのx / y座標を取得するために求めている球面座標(緯度と経度)です。

public Void getPointPosOnSphere(float Longitude,float Latitude,float r) {
    x = r*Mathf.sin(Longitude)*Mathf.cos(Latitude);
    y = r*Mathf.sin(Longitude)*Mathf.sin(Latitude);
    z = r*Mathf.cos(Longitude);
    return new Vector3(x,y,z);
}

//here you could have a for loop iterating through points of your rectangle for each
//point you'd have associated a map coordinate :
Vector3 pointSpacePos = getPointPosOnSphere(pointCoordY,pointCoordX,HalfDiamater);
//End of the for loop

次に、2D座標系のxy位置から球体マッピングに従って空間の3D位置に変換されたクワッドを球体にマッピングします。

編集:ちょうどアイデアを得た、さらに進むために、そのようなUV値を使用して球上の平面の座標をカプセル化することができました:

for(int i = 0;i < vertices.Length; i++) {
    vertices[i] = getPointPosOnSphere(UV[i].y,UV[i].x,HalfDiamater);
}

そこで、UV値を割り当てるだけで、お気に入りの3Dソフトウェアでクワッドの位置を管理することができます(または、コードを1にして統一することもできます)(両方の軸で0から1の場合、クワッドは球全体にラップされます)。

警告:UVを使用するには、ラジアンから度への変換を行う必要があります。(UVは0から1であるため)


0

上記のGéryArduinoの答えは私を正しい方向に導きましたが、ここにいくつかのことを追加したいと思います。

1)座標系の違いにより、以下は単一では機能しません

    return new Vector3(x,y,z); 

これをに変更

    return new Vector3(x,z,y);

2)メソッドシグネチャで定義されたlong値とlat値の入力範囲が明確ではなかった

     public Void getPointPosOnSphere(float Longitude,float Latitude,float r)

経度と緯度の両方の値はラジアンである必要があります。それらの範囲は次のとおりです

     Longitude: 0°-180° (0 - π)
     Latitude: 0°-360° (0 - 2π)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.