Texture.GetTransformValues

導入

v3.5

詳細

そのマテリアルの現在の OGLハードウェア表示設定に基づいてUVW値を計算します。値はクラスタ プロパティから読み込まれ、次のテクスチャ オブジェクトが計算に使用されます。

- テクスチャ プロジェクション定義

- テクスチャ シェーダ

- イメージ クリップ

ビット フラグを使用して、適用するテクスチャ変換エフェクトを指定します。一部のテクスチャ変換エフェクトは概算である点に注意してください。たとえば、GetTransformValues はテクスチャの繰り返しに必要な新しいサンプリングポイントを作成するためにサーフェイスを再サンプリングすることはできません。

スクリプト 構文

oVariant = Texture.GetTransformValues( Flags );

戻り値

Double値のArrayを含むVariant値この配列は、Material.CurrentUVの順序と同じです。

パラメータ

パラメータ タイプ 詳細
フラグ Long 計算する変換結果を指定するsiTextureEffectsComputationビットフラグ。複数のエフェクトを適用するには、併せて定数値を追加します。たとえば、すべてのフラグを設定するには、すべてのフラグ定数値の合計である127(10進数)を使用します。

1. VBScript の例

'
' 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

2. JScript の例

// 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

関連項目

Cluster ClusterProperty ClusterElementCollection.Array