スクリプティングの平坦なコントロール ポイントの配列では、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 などの関数に渡す前に、配列の順序を逆にする必要があります。
この関数は、通常、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; } } }