100 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			100 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C#
		
	
	
	
|   | using System.Collections; | ||
|  | using System.Collections.Generic; | ||
|  | using Godot; | ||
|  | 
 | ||
|  | namespace Rokojori | ||
|  | { | ||
|  |   public class Pose | ||
|  | 	{ | ||
|  |     bool _needsUpdate = true; | ||
|  |     Quaternion _rotation = Quaternion.Identity; | ||
|  |     public Quaternion rotation  | ||
|  |     { | ||
|  |       get => _rotation; | ||
|  |       set | ||
|  |       { | ||
|  |         _rotation = value; | ||
|  |         _needsUpdate = true; | ||
|  |       } | ||
|  |     } | ||
|  | 
 | ||
|  |     Vector3 _position = Vector3.Zero; | ||
|  |     public Vector3 position | ||
|  |     { | ||
|  |       get => _position; | ||
|  |       set | ||
|  |       { | ||
|  |         _position = value; | ||
|  |         _needsUpdate = true; | ||
|  |       }     | ||
|  |        | ||
|  |     } | ||
|  | 
 | ||
|  |     Basis _basis; | ||
|  | 
 | ||
|  |     void Update() | ||
|  |     { | ||
|  |       if ( ! _needsUpdate ) | ||
|  |       { | ||
|  |         return; | ||
|  |       } | ||
|  |        | ||
|  |       _needsUpdate = false; | ||
|  | 
 | ||
|  |       _basis = new Basis( _rotation ); | ||
|  |     } | ||
|  | 
 | ||
|  |     public Vector3 forward | ||
|  |     { | ||
|  |       get | ||
|  |       { | ||
|  |         Update(); | ||
|  | 
 | ||
|  |         return -_basis.Z;  | ||
|  |       } | ||
|  |     } | ||
|  | 
 | ||
|  |     public Vector3 right | ||
|  |     { | ||
|  |       get | ||
|  |       { | ||
|  |         Update(); | ||
|  | 
 | ||
|  |         return _basis.X;  | ||
|  |       } | ||
|  |     } | ||
|  | 
 | ||
|  |     public Vector3 up | ||
|  |     { | ||
|  |       get | ||
|  |       { | ||
|  |         Update(); | ||
|  | 
 | ||
|  |         return _basis.Y;  | ||
|  |       } | ||
|  |     } | ||
|  | 
 | ||
|  |     public Pose() | ||
|  |     { | ||
|  | 
 | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  |     public Pose ToGlobal( Node3D n ) | ||
|  |     { | ||
|  |       var p = new Pose(); | ||
|  |       p.rotation = rotation * n.GetGlobalQuaternion(); | ||
|  |       p.position = n.ToGlobal( position ); | ||
|  |       return p; | ||
|  |     } | ||
|  | 
 | ||
|  |     public Vector3 Apply( Vector3 p ) | ||
|  |     { | ||
|  |       p = rotation * p; | ||
|  |       p += position; | ||
|  | 
 | ||
|  |       return p; | ||
|  |     } | ||
|  | 
 | ||
|  |   } | ||
|  | } |