root/as3/FLARToolKit/trunk/libs/Papervision3D/src/org/papervision3d/materials/utils/LightMatrix.as

リビジョン 3288, 3.4 kB (コミッタ: rokubou, コミット時期: 3 年 前)

Add Papervison3D.

Line 
1 package org.papervision3d.materials.utils
2 {
3         import org.papervision3d.Papervision3D;
4         import org.papervision3d.core.math.Matrix3D;
5         import org.papervision3d.core.math.Number3D;
6         import org.papervision3d.core.proto.LightObject3D;
7         import org.papervision3d.core.render.data.RenderSessionData;
8         import org.papervision3d.lights.PointLight3D;
9         import org.papervision3d.objects.DisplayObject3D;
10
11         /**
12          * @Author Tim Knip / Ralph Hauwert
13          */
14         public class LightMatrix
15         {
16                
17                 private static var lightMatrix:Matrix3D = Matrix3D.IDENTITY;
18                 private static var invMatrix:Matrix3D = Matrix3D.IDENTITY;
19        
20                 private static var _targetPos:Number3D = new Number3D();
21                 private static var _lightPos:Number3D = new Number3D();
22                 private static var _lightDir:Number3D = new Number3D();
23                 private static var _lightUp:Number3D = new Number3D();
24                 private static var _lightSide:Number3D = new Number3D();
25                
26                 protected static var UP:Number3D = new Number3D(0, 1, 0);
27                
28                 /**
29                  * Gets the 'lightmatrix' for a light and object.
30                  *
31                  * @param       light
32                  * @param       object
33                  * @return
34                  */
35                 public static function getLightMatrix(light:LightObject3D, object:DisplayObject3D, renderSessionData:RenderSessionData, objectLightMatrix:Matrix3D):Matrix3D
36                 {
37                         var lightMatrix:Matrix3D = objectLightMatrix ? objectLightMatrix : Matrix3D.IDENTITY;
38                         if(light == null){
39                                 light = new PointLight3D();
40                                 light.copyPosition(renderSessionData.camera);
41                         }
42                         _targetPos.reset();
43                         _lightPos.reset();
44                         _lightDir.reset();
45                         _lightUp.reset();
46                         _lightSide.reset();
47                        
48                         if(!object)
49                         {
50                                 return lightMatrix;
51                         }
52                         // NOTE: we basically perform a lookAt.
53                         var ml:Matrix3D = light.transform;
54                         var mo:Matrix3D = object.world;
55                        
56                         // invert light position!
57                         _lightPos.x = -ml.n14;
58                         _lightPos.y = -ml.n24;
59                         _lightPos.z = -ml.n34;
60                                                        
61                         // object position
62                         _targetPos.x = -mo.n14;
63                         _targetPos.y = -mo.n24;
64                         _targetPos.z = -mo.n34;
65                        
66                         // direction vector from light to object
67                         _lightDir.x = _targetPos.x - _lightPos.x;
68                         _lightDir.y = _targetPos.y - _lightPos.y;
69                         _lightDir.z = _targetPos.z - _lightPos.z;
70
71                         // account for object's transformation
72                         invMatrix.calculateInverse(object.world);
73                         Matrix3D.multiplyVector3x3(invMatrix, _lightDir);
74                    
75                         // normalize!
76                         _lightDir.normalize();
77                        
78                         // inlined:  Number3D.cross(UP, _lightDir);
79                         _lightSide.x = (_lightDir.y * UP.z) - (_lightDir.z * UP.y);
80                         _lightSide.y = (_lightDir.z * UP.x) - (_lightDir.x * UP.z);
81                         _lightSide.z = (_lightDir.x * UP.y) - (_lightDir.y * UP.x);
82                         _lightSide.normalize(); // needed?
83                        
84                         // inlined: Number3D.cross(_lightDir, dir_x);
85                         _lightUp.x = (_lightSide.y * _lightDir.z) - (_lightSide.z * _lightDir.y);
86                         _lightUp.y = (_lightSide.z * _lightDir.x) - (_lightSide.x * _lightDir.z);
87                         _lightUp.z = (_lightSide.x * _lightDir.y) - (_lightSide.y * _lightDir.x);
88                         _lightUp.normalize(); // needed?
89
90                         if(Papervision3D.useRIGHTHANDED || object.flipLightDirection)
91                         {
92                                 _lightDir.x = -_lightDir.x;
93                                 _lightDir.y = -_lightDir.y;
94                                 _lightDir.z = -_lightDir.z;
95                         }
96                        
97                         // copy values
98                         lightMatrix.n11 = _lightSide.x;
99                         lightMatrix.n12 = _lightSide.y;
100                         lightMatrix.n13 = _lightSide.z;
101                         lightMatrix.n21 = _lightUp.x;
102                         lightMatrix.n22 = _lightUp.y;
103                         lightMatrix.n23 = _lightUp.z;
104                         lightMatrix.n31 = _lightDir.x;
105                         lightMatrix.n32 = _lightDir.y;
106                         lightMatrix.n33 = _lightDir.z;
107                        
108                        
109                         return lightMatrix;
110                 }               
111         }
112 }
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。