スクリプティングの平坦なコントロール ポイントの配列では、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;
}
}
}