Merge pull request #1406 from zeeshan595/master
Added support for angle axies rotation nodes
This commit is contained in:
commit
c70478c11e
|
@ -1,18 +1,44 @@
|
|||
package armory.logicnode;
|
||||
|
||||
import iron.object.Object;
|
||||
import iron.math.Quat;
|
||||
import iron.math.Vec3;
|
||||
|
||||
class GetRotationNode extends LogicNode {
|
||||
|
||||
public function new(tree:LogicTree) {
|
||||
super(tree);
|
||||
}
|
||||
|
||||
override function get(from:Int):Dynamic {
|
||||
var object:Object = inputs[0].get();
|
||||
|
||||
if (object == null) return null;
|
||||
|
||||
return object.transform.rot.getEuler();
|
||||
if (object == null)
|
||||
return null;
|
||||
var rot = object.transform.rot;
|
||||
switch (from) {
|
||||
case 1:
|
||||
// euler angles
|
||||
return object.transform.rot.getEuler();
|
||||
case 2:
|
||||
// vector
|
||||
var sqrtW = Math.sqrt(1 - (rot.w * rot.w));
|
||||
if (sqrtW == 0)
|
||||
return new Vec3(0, 0, 1);
|
||||
return new Vec3(rot.x / sqrtW, rot.y / sqrtW, rot.z / sqrtW);
|
||||
case 3:
|
||||
// angle radians
|
||||
var angle = 2 * Math.acos(rot.w);
|
||||
return angle;
|
||||
case 4:
|
||||
// angle degrees
|
||||
var angle = 2 * Math.acos(rot.w);
|
||||
return angle * (180 / Math.PI);
|
||||
case 5:
|
||||
//quaternion xyz
|
||||
return new Vec3(rot.x, rot.y, rot.z);
|
||||
case 6:
|
||||
//quaternion w
|
||||
return rot.w;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,10 +1,12 @@
|
|||
package armory.logicnode;
|
||||
|
||||
import iron.object.Object;
|
||||
import iron.math.Vec4;
|
||||
import iron.math.Quat;
|
||||
import iron.math.Vec3;
|
||||
import armory.trait.physics.RigidBody;
|
||||
|
||||
class SetRotationNode extends LogicNode {
|
||||
public var property0:String;
|
||||
|
||||
public function new(tree:LogicTree) {
|
||||
super(tree);
|
||||
|
@ -12,18 +14,32 @@ class SetRotationNode extends LogicNode {
|
|||
|
||||
override function run(from:Int) {
|
||||
var object:Object = inputs[1].get();
|
||||
var vec:Vec4 = inputs[2].get();
|
||||
|
||||
if (object == null || vec == null) return;
|
||||
|
||||
object.transform.rot.fromEuler(vec.x, vec.y, vec.z);
|
||||
if (object == null)
|
||||
return;
|
||||
var vec:Vec3 = inputs[2].get();
|
||||
var w:Float = inputs[3].get();
|
||||
switch (property0) {
|
||||
case "Euler Angles":
|
||||
object.transform.rot.fromEuler(vec.x, vec.y, vec.z);
|
||||
case "Angle Axies (Degrees)" | "Angle Axies (Radians)":
|
||||
var angle:Float = w;
|
||||
if (property0 == "Angle Axies (Degrees)") {
|
||||
angle = angle * (Math.PI / 180);
|
||||
}
|
||||
var angleSin = Math.sin(angle / 2);
|
||||
vec = vec.normalize();
|
||||
vec = new Vec3(vec.x * angleSin, vec.y * angleSin, vec.z * angleSin);
|
||||
var angleCos = Math.cos(angle / 2);
|
||||
object.transform.rot = new Quat(vec.x, vec.y, vec.z, angleCos);
|
||||
case "Quaternion":
|
||||
object.transform.rot = new Quat(vec.x, vec.y, vec.z, w);
|
||||
}
|
||||
object.transform.buildMatrix();
|
||||
|
||||
#if arm_physics
|
||||
var rigidBody = object.getTrait(RigidBody);
|
||||
if (rigidBody != null) rigidBody.syncTransform();
|
||||
if (rigidBody != null)
|
||||
rigidBody.syncTransform();
|
||||
#end
|
||||
|
||||
runOutput(0);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,10 +9,21 @@ class SetRotationNode(Node, ArmLogicTreeNode):
|
|||
bl_label = 'Set Rotation'
|
||||
bl_icon = 'QUESTION'
|
||||
|
||||
property0: EnumProperty(
|
||||
items = [('Euler Angles', 'Euler Angles', 'Euler Angles'),
|
||||
('Angle Axies (Radians)', 'Angle Axies (Radians)', 'Angle Axies (Radians)'),
|
||||
('Angle Axies (Degrees)', 'Angle Axies (Degrees)', 'Angle Axies (Degrees)'),
|
||||
('Quaternion', 'Quaternion', 'Quaternion')],
|
||||
name='', default='Euler Angles')
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('ArmNodeSocketAction', 'In')
|
||||
self.inputs.new('ArmNodeSocketObject', 'Object')
|
||||
self.inputs.new('NodeSocketVector', 'Rotation')
|
||||
self.inputs.new('NodeSocketVector', 'Euler Angles / Vector XYZ')
|
||||
self.inputs.new('NodeSocketFloat', 'Angle / W')
|
||||
self.outputs.new('ArmNodeSocketAction', 'Out')
|
||||
|
||||
def draw_buttons(self, context, layout):
|
||||
layout.prop(self, 'property0')
|
||||
|
||||
add_node(SetRotationNode, category='Action')
|
||||
|
|
|
@ -11,6 +11,11 @@ class GetRotationNode(Node, ArmLogicTreeNode):
|
|||
|
||||
def init(self, context):
|
||||
self.inputs.new('ArmNodeSocketObject', 'Object')
|
||||
self.outputs.new('NodeSocketVector', 'Rotation')
|
||||
self.outputs.new('NodeSocketVector', 'Euler Angles')
|
||||
self.outputs.new('NodeSocketVector', 'Vector')
|
||||
self.outputs.new('NodeSocketFloat', 'Angle (Radians)')
|
||||
self.outputs.new('NodeSocketFloat', 'Angle (Degrees)')
|
||||
self.outputs.new('NodeSocketVector', 'Quaternion XYZ')
|
||||
self.outputs.new('NodeSocketFloat', 'Quaternion W')
|
||||
|
||||
add_node(GetRotationNode, category='Value')
|
||||
|
|
Loading…
Reference in a new issue