Texture.GetTransformValues

導入

v3.5

詳細

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

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

- テクスチャ シェーダ

- イメージ クリップ

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

C#構文

Object Texture.GetTransformValues( Int32 );

スクリプト構文

oVariant = Texture.GetTransformValues( Flags );

戻り値

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

パラメータ

パラメータ タイプ 説明
Flags 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