v3.5
そのマテリアルの現在の OGLハードウェア表示設定に基づいてUVW値を計算します。値はクラスタ
プロパティから読み込まれ、次のテクスチャ オブジェクトが計算に使用されます。
- テクスチャ プロジェクション定義
- テクスチャ シェーダ
- イメージ クリップ
ビット
フラグを使用して、適用するテクスチャ変換エフェクトを指定します。一部のテクスチャ変換エフェクトは概算である点に注意してください。たとえば、GetTransformValues
はテクスチャの繰り返しに必要な新しいサンプリングポイントを作成するためにサーフェイスを再サンプリングすることはできません。
oVariant = Texture.GetTransformValues( Flags ); |
Double値のArrayを含むVariant値この配列は、Material.CurrentUVの順序と同じです。
| パラメータ | タイプ | 詳細 |
|---|---|---|
| フラグ | Long | 計算する変換結果を指定するsiTextureEffectsComputationビットフラグ。複数のエフェクトを適用するには、併せて定数値を追加します。たとえば、すべてのフラグを設定するには、すべてのフラグ定数値の合計である127(10進数)を使用します。 |
'
' This example shows how to use this Texture.GetTransformValues to bake the UVW effects directly in the cluster property
' This is done on the object material and assumes only one TextureProjection definition.
'
' Create scene content
NewScene , false
set oGrid = CreatePrim( "Grid", "MeshSurface" )
SetValue oGrid & ".polymsh.geom.subdivu", 2
SetValue oGrid & ".polymsh.geom.subdivv", 1
ApplyShader ,,,, siLetLocalMaterialsOverlap
BlendInPresetsInsp ,,, True, True
CreateProjection oGrid, siTxtPlanarXZ, siTxtDefaultSpherical, "Texture_Support", "Texture_Projection"
SetInstanceDataValue , oGrid & ".Material.Phong.ambient_blend.Image.tspace_id", "Texture_Projection"
' Set a translation in U of 0.5
SetValue oGrid & ".polymsh.cls.Texture_Coordinates_AUTO.Texture_Projection.Texture_Projection_Def.projtrsu", 0.5
' Freeze everything ;-)
FreezeCurrentUV 127
sub FreezeCurrentUV( in_lFlags )
set oMy3DObject = Application.Selection(0)
if TypeName(oMy3DObject) <> "X3DObject" then
Application.LogMessage "The command won't perform it should be connected to an X3DObject"
else
if TypeName(oMy3DObject.ActivePrimitive.Geometry) = "PolygonMesh" then
set oMaterial = oMy3DObject.Material
set oClusterProperty = oMaterial.CurrentUV
set oTexture = oMaterial.CurrentTexture
if TypeName(oTexture) <> "Nothing" then
aUVWValues = oTexture.GetTransformValues( in_lFlags )
FreezeUVWValues oClusterProperty, aUVWValues
SetDefaultValues oMaterial, oTexture, oClusterProperty, in_lflags
else
Application.LogMessage "There's no current texture"
end if
else
Application.LogMessage "The command won't perform it should be connected to a PolygonMesh object"
end if
end if
end sub
' The array is already in cluster offset order
sub FreezeUVWValues(in_oClusterProperty, in_aUVWValues)
aOLDUVWValues = in_oClusterProperty.Elements.Array
for i = 0 to ubound(aOLDUVWValues,2)
aOLDUVWValues(0,i) = in_aUVWValues(i*3)
aOLDUVWValues(1,i) = in_aUVWValues(i*3 + 1)
aOLDUVWValues(2,i) = in_aUVWValues(i*3 + 2)
next
in_oClusterProperty.Elements.Array = aOLDUVWValues
end sub
' Reset the default values, so to remove the actions of those effects on the
' Texture projection cluster property.
sub SetDefaultValues(in_oMaterial, in_oTexture, in_oClusterProperty, in_lflags)
if in_lflags and siTextureComputeTransformation then
strClusterProperty = in_oClusterProperty.FullName
' Set translation
SetValue strClusterProperty & ".Texture_Projection_Def.projtrsu", 0
SetValue strClusterProperty & ".Texture_Projection_Def.projtrsv", 0
SetValue strClusterProperty & ".Texture_Projection_Def.projtrsw", 0
' Set scaling
SetValue strClusterProperty & ".Texture_Projection_Def.projsclu", 1
SetValue strClusterProperty & ".Texture_Projection_Def.projsclv", 1
SetValue strClusterProperty & ".Texture_Projection_Def.projsclw", 1
' Set rotation
SetValue strClusterProperty & ".Texture_Projection_Def.projrotu", 0
SetValue strClusterProperty & ".Texture_Projection_Def.projrotv", 0
SetValue strClusterProperty & ".Texture_Projection_Def.projrotw", 0
end if
if in_lflags and siTextureComputeWrapping then
strClusterProperty = in_oClusterProperty.FullName
' Set wrapping
SetValue strClusterProperty & ".Texture_Projection_Def.wrap_u", false
SetValue strClusterProperty & ".Texture_Projection_Def.wrap_v", false
SetValue strClusterProperty & ".Texture_Projection_Def.wrap_w", false
end if
if in_lflags and siTextureComputeRepeats then
strTexture = in_oTexture.FullName
SetValue strTexture & ".repeats.x", 1
SetValue strTexture & ".repeats.y", 1
SetValue strTexture & ".repeats.z", 1
end if
if in_lflags and siTextureComputeUVRemap then
strTexture = in_oTexture.FullName
SetValue strTexture & ".min.x", 0
SetValue strTexture & ".min.y", 0
SetValue strTexture & ".min.z", 0
SetValue strTexture & ".max.x", 1
SetValue strTexture & ".max.y", 1
SetValue strTexture & ".max.z", 1
end if
if in_lflags and siTextureComputeAlternate then
strTexture = in_oTexture.FullName
SetValue strTexture & ".alt_x", 0
SetValue strTexture & ".alt_y", 0
end if
if in_lflags and siTextureComputeCropping then
set oImageClip = in_oMaterial.CurrentImageClip
strImageClip = oImageClip.FullName
SetValue strImageClip & ".Xmin", 0
SetValue strImageClip & ".Ymin", 0
SetValue strImageClip & ".Xmax", 1
SetValue strImageClip & ".Ymax", 1
end if
if in_lflags and siTextureComputeFlip then
set oImageClip = in_oMaterial.CurrentImageClip
strImageClip = oImageClip.FullName
SetValue strImageClip & ".FlipX", False
SetValue strImageClip & ".FlipY", False
end if
end sub
|
// This example demonstrated the relationship
// between Texture.GetTransformValues, the Texture Projection
// and the Cluster Property
var sProjectionName = "MyProjection" ;
var oCylinder = CreateCylinderWithMaterial() ;
var oCurrentTexture = oCylinder.Material.CurrentTexture ;
logmessage( "Current Texture: " + oCurrentTexture.FullName ) ;
logmessage( "Current UV: " + oCylinder.Material.CurrentUV.FullName ) ;
logmessage( "Current ImageClip: " + oCylinder.Material.CurrentImageClip ) ;
logmessage( "-------------Before applying a repeat----------" ) ;
PrintTransformValues( oCurrentTexture ) ;
// Now actually apply a transformation at the Texture level
oCurrentTexture.Parameters( "repeats" ).Parameters("x").Value = 2 ;
logmessage( "-------------After applying a repeat----------" ) ;
PrintTransformValues( oCurrentTexture ) ;
// Show that the raw data was not affected
logmessage( "-------------Raw UV----------" ) ;
PrintRawProjectionData( oCylinder ) ;
SetDisplayMode("Camera", "texturedecal");
function CreateCylinderWithMaterial()
{
// Function to create a sample scene. It has a Cylinder
// with a simple render tree of an image connected to a Phong.
// To simplify the example it does not load a specific image
// clip so it is using the default noIcon image.
// Create a cylinder
newscene(null,false) ;
var oCylinder = ActiveSceneRoot.AddGeometry( "Cylinder", "MeshSurface" ) ;
// Reduce the size of the geometry to reduce the amount of UV values we will print out
var oGeometryParams = GetValue( oCylinder + ".polymsh.geom" ).Parameters
oGeometryParams("subdivu").Value = 2
oGeometryParams("subdivv").Value = 1
oGeometryParams("subdivbase").Value = 1
var oMaterial = oCylinder.AddMaterial( "Phong" ) ;
var oPhong = oMaterial.Shaders(0)
var oPhongParams = oPhong.Parameters ;
// Create a texture node and connect it to both ambient and diffuse
var oTextureShader = oPhongParams( "ambient" ).ConnectFromPreset("Image", siTextureShaderFamily) ;
oPhongParams( "diffuse" ).Connect( oTextureShader ) ;
// At this point the texture will not draw because there is
// no projection to map the 2D onto the 3D
// This command creates the projection and the support
CreateProjection(
oCylinder,
siTxtCylindrical,
siTxtDefaultCylindrical,
"MySupport", // Name to give new support
sProjectionName, // Name to give new projection
null,
null,
null);
// Connect the projection
oTextureShader.Parameters("tspace_id").SetInstanceValue( oCylinder,sProjectionName ) ;
return oCylinder ;
}
function PrintRawProjectionData( in_oObj )
{
// Find the ClusterProperty that contains the raw UVW values
// of the current texture
var oTextureClusterProperty = in_oObj.Material.CurrentUV ;
PrintUVWClusterProperty( oTextureClusterProperty ) ;
}
function PrintUVWClusterProperty( in_oTextureClusterProperty )
{
// Print the UVW cluster property. It shows how to read
// the 2-Dimensional data with JScript VBArray object
logmessage( "Contents of " + in_oTextureClusterProperty.FullName ) ;
var aRawUVValues = new VBArray( in_oTextureClusterProperty.Elements.Array ) ;
for ( i = 0 ; i <= aRawUVValues.ubound(2) ; i++ )
{
logmessage( "UVW["+i+"] = "
+ XSIRound( aRawUVValues.getItem( 0, i ), 2) + "," +
+ XSIRound( aRawUVValues.getItem( 1, i ), 2) + "," +
+ XSIRound( aRawUVValues.getItem( 2, i ), 2)) ;
}
}
function PrintTransformValues( in_oTexture )
{
// Print the transformed UVW values associated with the texture
// It shows how the data is structured as a flattened 1D array
logmessage( "Fully transformed contents of " + in_oTexture.FullName ) ;
aTransformedTexture = new VBArray(in_oTexture.GetTransformValues(127)) ;
// We have a 1 dimensional array, with the U,V,W values flattened
cntItems = ( aTransformedTexture.ubound(1) + 1 ) / 3 ;
for ( i = 0 ; i < cntItems ; i++ )
{
logmessage( "UVW["+i+"] = "
+ XSIRound( aTransformedTexture.getItem( 3*i ), 2) + "," +
+ XSIRound( aTransformedTexture.getItem( 3*i+1 ), 2) + "," +
+ XSIRound( aTransformedTexture.getItem( 3*i+2 ), 2)) ;
}
}
// Output:
//
//INFO : Current Texture: cylinder.Material.Phong.Image
//INFO : Current UV: cylinder.polymsh.cls.Texture_Coordinates_AUTO.MyProjection
//INFO : Current ImageClip: Clips.noIcon_pic
//INFO : -------------Before applying a repeat----------
//INFO : Fully transformed contents of cylinder.Material.Phong.Image
//INFO : UVW[0] = 0.61,0,0
//INFO : UVW[1] = 0.25,0,0
//INFO : UVW[2] = 0.75,0,0
//...snip...
//INFO : UVW[28] = 1.25,1,0
//INFO : UVW[29] = 0.75,1,0
//INFO : -------------After applying a repeat----------
//INFO : Fully transformed contents of cylinder.Material.Phong.Image
//INFO : UVW[0] = 1.23,0,0
//INFO : UVW[1] = 0.5,0,0
//INFO : UVW[2] = 1.5,0,0
//...snip...
//INFO : UVW[28] = 1.5,1,0
//INFO : UVW[29] = 0.5,1,0
//INFO : -------------Raw UV----------
//INFO : Contents of cylinder.polymsh.cls.Texture_Coordinates_AUTO.MyProjection
//INFO : UVW[0] = 0.61,0,0
//INFO : UVW[1] = 0.25,0,0
//INFO : UVW[2] = 0.75,0,0
//...snip...
//INFO : UVW[28] = 1.25,1,0
//INFO : UVW[29] = 0.75,1,0
|