A game about forced loneliness, made by TACStudios
1# Transform Node 2 3## Description 4 5Returns the result of transforming the input value (**In**) from one coordinate space to another. Select dropdown options on the node to define which spaces to transform from and to. 6 7## Ports 8 9| Name | Direction | Type | Description | 10|:-----|:----------|:---------|:-------------| 11| In | Input | Vector 3 | Input value | 12| Out | Output | Vector 3 | Output value | 13 14## Controls 15 16| Name | Type | Options | Description | 17|:-----|:---------|:-----------------------------------------------------|:------------| 18| From | Dropdown | Object, View, World, Tangent, Absolute World, Screen | Select the space to convert from. | 19| To | Dropdown | Object, View, World, Tangent, Absolute World, Screen | Select the space to convert to. | 20| Type | Dropdown | Position, Direction, Normal | Select how you want to handle the conversion. | 21 22## Node Settings Controls 23 24The following control appears on the Node Settings tab of the Graph Inspector when you select the **Direction** or **Normal** conversion types for the Transform Node. The Normalize Output setting helps to improve performance as you can disable it if the output is already normalized, or if you don't need the output to remain normalized. 25 26| Name | Type | Description | 27|:-----------------|:---------|:------------| 28| Normalize Output | Checkbox | Reduces the length of the output vector to 1. | 29 30## World and Absolute World 31 32Use the **World** and **Absolute World** space options to transform the coordinate space of [position](Position-Node.md) values. The **World** space option uses the Scriptable Render Pipeline default world space to convert position values. The **Absolute World** space option uses absolute world space to convert position values in all Scriptable Render Pipelines. 33 34If you use the **Transform Node** to convert coordinate spaces that aren't for position values, Unity recommends that you use the **World** space option. Using **Absolute World** on values that don't represent position might result in unexpected behavior. 35 36## Conversion type 37 38Select the **Position** type to apply translation to the transformation. Select **Direction** if the input doesn't describe a surface normal (the direction a surface faces). Select **Normal** if the input describes a surface normal (the direction the surface faces). 39 40 41## Generated Code Example 42 43The following example code represents one possible outcome of this node per **Base** mode. 44 45**World > World** 46 47``` 48float3 _Transform_Out = In; 49``` 50 51**World > Object** 52 53``` 54float3 _Transform_Out = TransformWorldToObject(In); 55``` 56 57**World > Tangent** 58 59``` 60float3x3 tangentTransform_World = float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal); 61float3 _Transform_Out = TransformWorldToTangent(In, tangentTransform_World); 62``` 63 64**World > View** 65 66``` 67float3 _Transform_Out = TransformWorldToView(In); 68``` 69**World > Absolute World** 70 71``` 72float3 _Transform_Out = GetAbsolutePositionWS(In); 73``` 74 75**World > Screen** 76 77``` 78float4 hclipPosition = TransformWorldToHClipDir(In); 79float3 screenPos = hclipPosition.xyz / hclipPosition.w; 80float3 _Transform_Out = float3(screenPos.xy * 0.5 + 0.5, screenPos.z); 81``` 82 83**Object > World** 84 85``` 86float3 _Transform_Out = TransformObjectToWorld(In); 87``` 88 89**Object > Object** 90 91``` 92float3 _Transform_Out = In; 93``` 94 95**Object > Tangent** 96 97``` 98float3x3 tangentTransform_World = float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal); 99float3 _Transform_Out = TransformWorldToTangent(TransformObjectToWorld(In), tangentTransform_World); 100``` 101 102**Object > View** 103 104``` 105float3 _Transform_Out = TransformWorldToView(TransformObjectToWorld(In)); 106``` 107**Object > Absolute World** 108 109``` 110float3 _Transform_Out = GetAbsolutePositionWS(TransformObjectToWorld(In)); 111``` 112**Object > Screen** 113 114``` 115float4 hclipPosition = TransformObjectToHClip(In); 116float3 screenPos = hclipPosition.xyz / hclipPosition.w; 117float3 _Transform_Out = float3(screenPos.xy * 0.5 + 0.5, screenPos.z); 118``` 119**Tangent > World** 120 121``` 122float3x3 transposeTangent = transpose(float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal)); 123float3 _Transform_Out = mul(In, transposeTangent).xyz; 124``` 125 126**Tangent > Object** 127 128``` 129float3x3 transposeTangent = transpose(float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal)); 130float3 _Transform_Out = TransformWorldToObject(mul(In, transposeTangent).xyz); 131``` 132 133**Tangent > Tangent** 134 135``` 136float3 _Transform_Out = In; 137``` 138 139**Tangent > View** 140 141``` 142float3x3 transposeTangent = transpose(float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal)); 143float3 _Transform_Out = TransformWorldToView(mul(In, transposeTangent).xyz); 144``` 145**Tangent > Absolute World** 146 147``` 148float3x3 transposeTangent = transpose(float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal)); 149float3 _Transform_Out = GetAbsolutePositionWS(mul(In, transposeTangent)).xyz; 150``` 151 152**Tangent > Screen** 153 154``` 155float3x3 transposeTangent = transpose(float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal)); 156float4 hclipPosition = TransformWorldToHClipDir(mul(In, transposeTangent).xyz); 157float3 screenPos = hclipPosition.xyz / hclipPosition.w; 158float3 _Transform_Out = float3(screenPos.xy * 0.5 + 0.5, screenPos.z); 159``` 160 161**View > World** 162 163``` 164float3 _Transform_Out = mul(UNITY_MATRIX_I_V, float4(In, 1)).xyz; 165``` 166 167**View > Object** 168 169``` 170float3 _Transform_Out = TransformWorldToObject(mul(UNITY_MATRIX_I_V, float4(In, 1) ).xyz); 171``` 172 173**View > Tangent** 174 175``` 176float3x3 tangentTransform_World = float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal); 177float3 _Transform_Out = TransformWorldToTangent(mul(UNITY_MATRIX_I_V, float4(In, 1) ).xyz, tangentTransform_World); 178``` 179 180**View > View** 181 182``` 183float3 _Transform_Out = In; 184``` 185**View > Absolute World** 186 187``` 188float3 _Transform_Out = GetAbsolutePositionWS(mul(UNITY_MATRIX_I_V, float4(In, 1))).xyz; 189``` 190 191**View > Screen** 192 193``` 194float4 hclipPosition = TransformWViewToHClip(In); 195float3 screenPos = hclipPosition.xyz / hclipPosition.w; 196float3 _Transform_Out = float3(screenPos.xy * 0.5 + 0.5, screenPos.z); 197``` 198 199**Absolute World > World** 200 201``` 202float3 _Transform_Out = GetCameraRelativePositionWS(In); 203``` 204 205**Absolute World > Object** 206 207``` 208float3 _Transform_Out = TransformWorldToObject(In); 209``` 210 211**Absolute World > Object (in the High Definition Render Pipeline)** 212 213``` 214float3 _Transform_Out = TransformWorldToObject(GetCameraRelativePositionWS(In)); 215``` 216 217**Absolute World > Tangent** 218 219``` 220float3x3 tangentTransform_World = float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal); 221float3 _Transform_Out = TransformWorldToTangent(In, tangentTransform_World); 222``` 223 224**Absolute World > View** 225 226``` 227float3 _Transform_Out = GetCameraRelativePositionWS(In) 228``` 229**Absolute World > Absolute World** 230 231``` 232float3 _Transform_Out = In; 233``` 234 235**Absolute World > Screen** 236 237``` 238float4 hclipPosition = TransformWorldToHClip(GetCameraRelativePositionWS(In)); 239float3 screenPos = hclipPosition.xyz / hclipPosition.w; 240float3 _Transform_Out = float3(screenPos.xy * 0.5 + 0.5, screenPos.z); 241``` 242**Screen > World** 243 244``` 245float3 _Transform_Out = ComputeWorldSpacePosition(In.xy, In.z, UNITY_MATRIX_I_VP); 246``` 247 248**Screen > Object** 249``` 250float3 worldPos = ComputeWorldSpacePosition(In.xy, In.z, UNITY_MATRIX_I_VP); 251float3 _Transform_Out = TransformWorldToObject(worldPos); 252``` 253 254**Screen > Tangent** 255``` 256float3 worldPos = ComputeWorldSpacePosition(In.xy, In.z, UNITY_MATRIX_I_VP); 257float3x3 tangentTransform_World = float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal); 258float3 _Transform_Out = TransformWorldToTangent(worldPos, tangentTransform_World); 259``` 260 261**Screen > View** 262``` 263float4 positionCS = ComputeClipSpacePosition(In.xy, In.z); 264float4 result = mul(UNITY_MATRIX_I_V, positionCS); 265float3 _Transform_Out = result.xyz / result.w; 266``` 267 268**Screen > Absolute World** 269 270``` 271float3 _Transform_Out = GetAbsolutePositionWS(ComputeWorldSpacePosition(In.xy, In.z, UNITY_MATRIX_I_VP)); 272```