UV順序

 
 
 

スクリプティングの平坦なコントロール ポイントの配列では、U-V 順序を使用します。

(0,0)...(0,cntV-1), (1,0)....(1,cntV-1),(cntU-1,0)...(cntU-1,cntV-1)

ところが、C++ API の場合、コントロール ポイントの配列は逆に並べられます(V-U)。

(0,0)...(cntU-1,0), (0,1)....(cntU-1,1)...(0,cntV-1)...(cntU-1,cntV-1)

つまり、スクリプティングで平坦なコントロール ポイントの配列を操作している場合は、コントロール ポイントの配列を取得して設定するときに、変換に関する問題は何も発生しません。 ただし、 C++ API で作業をしている場合は、コントロール ポイントの配列を NurbsSurface::Set および X3DObject::AddNurbsSurface などの関数に渡す前に、配列の順序を逆にする必要があります。

C++ API の例: コントロール ポイントの配列の順序を変更する(U-V から V-U へ)

この関数は、X3DObject::AddNurbsSurface または NurbsSurfaceMesh::Set を使用して NURBS サーフェイス メッシュを作成するデータを準備するために使用されます。 結果として作成される配列のサイズは in_nbU x in_nbV であり、U-V ポイントは V-U 順序に変更され、スクリプティングの NURBS サーフェイスの動作に一致するようになります。

// Convert a CDoubleArray containing xyzw UV coordinates to a CVector4Array 
void ConvertDoubleArrayToVector4Array
( 
	CDoubleArray& in_array, 
	LONG in_nbU, 
	LONG in_nbV,
	CVector4Array& out_array
)
{
	LONG nSize = in_nbU * in_nbV;
	if ( in_array.GetCount() < 4 * nSize )
	{
		Assert( in_array.GetCount() >= 4 * nSize ) ;
		nSize = in_array.GetCount()/4;		
	}
	out_array.Resize( nSize );

	// e.g. Original data is UV (0,0)...(0,cntV-1), (1,0)....(1,cntV-1),(cntU-1,0)...(cntU-1,cntV-1)
	// and we return data as (0,0)...(cntU-1,0), (0,1)....(cntU-1,1)...(0,cntV-1)...(cntU-1,cntV-1)

	LONG l = 0;
	for ( LONG i=0; i<in_nbU; i++ )	// U
	{
		for ( LONG j=0; j<in_nbV; j++ ) // V
		{			
			LONG k = i + j*in_nbU;			
			double x = in_array[l++];
			double y = in_array[l++];
			double z = in_array[l++];
			double w = in_array[l++];
			
			CVector4 v4(x*w,y*w,z*w,w);			
			out_array[k] = v4;
		}
	}
}