Merge pull request #1406 from zeeshan595/master

Added support for angle axies rotation nodes
This commit is contained in:
Lubos Lenco 2019-10-08 21:46:12 +02:00 committed by GitHub
commit c70478c11e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 74 additions and 16 deletions

View file

@ -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;
}
}

View file

@ -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);
}
}

View file

@ -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')

View file

@ -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')