我试图将跳跃动作默认坐标系从Leap Motion控制器更改为骨架中的A Bone。
这个脚本带有飞跃,我希望有人可以帮助我实现这一目标。
/******************************************************************************\
* Copyright (C) Leap Motion, Inc. 2011-2014. *
* Leap Motion proprietary. Licensed under Apache 2.0 *
* Available at http://www.apache.org/licenses/LICENSE-2.0.html *
\******************************************************************************/
using UnityEngine;
using System.Collections;
using Leap;
// Interface for all hands.
public abstract class HandModel : MonoBehaviour {
public const int NUM_FINGERS = 5;
public float handModelPalmWidth = 0.085f;
public FingerModel[] fingers = new FingerModel[NUM_FINGERS];
protected Hand hand_;
protected HandController controller_;
protected bool mirror_z_axis_ = false;
public Vector3 GetHandOffset() {
if (controller_ == null || hand_ == null)
return Vector3.zero;
Vector3 additional_movement = controller_.handMovementScale - Vector3.one;
Vector3 scaled_wrist_position =
Vector3.Scale(additional_movement, hand_.WristPosition.ToUnityScaled(mirror_z_axis_));
return controller_.transform.TransformPoint(scaled_wrist_position) -
controller_.transform.position;
}
// Returns the palm position of the hand in relation to the controller.
public Vector3 GetPalmPosition() {
return controller_.transform.TransformPoint(hand_.PalmPosition.ToUnityScaled(mirror_z_axis_)) +
GetHandOffset();
}
// Returns the palm rotation of the hand in relation to the controller.
public Quaternion GetPalmRotation() {
return GetController().transform.rotation * GetLeapHand().Basis.Rotation(mirror_z_axis_);
}
// Returns the palm direction of the hand in relation to the controller.
public Vector3 GetPalmDirection() {
return controller_.transform.TransformDirection(hand_.Direction.ToUnity(mirror_z_axis_));
}
// Returns the palm normal of the hand in relation to the controller.
public Vector3 GetPalmNormal() {
return controller_.transform.TransformDirection(hand_.PalmNormal.ToUnity(mirror_z_axis_));
}
// Returns the lower arm direction in relation to the controller.
public Vector3 GetArmDirection() {
return controller_.transform.TransformDirection(hand_.Arm.Direction.ToUnity(mirror_z_axis_));
}
// Returns the lower arm center in relation to the controller.
public Vector3 GetArmCenter() {
Vector leap_center = 0.5f * (hand_.Arm.WristPosition + hand_.Arm.ElbowPosition);
return controller_.transform.TransformPoint(leap_center.ToUnityScaled(mirror_z_axis_)) +
GetHandOffset();
}
// Returns the lower arm elbow position in relation to the controller.
public Vector3 GetElbowPosition() {
Vector3 local_position = hand_.Arm.ElbowPosition.ToUnityScaled(mirror_z_axis_);
return controller_.transform.TransformPoint(local_position) + GetHandOffset();
}
// Returns the lower arm wrist position in relation to the controller.
public Vector3 GetWristPosition() {
Vector3 local_position = hand_.Arm.WristPosition.ToUnityScaled(mirror_z_axis_);
return controller_.transform.TransformPoint(local_position) + GetHandOffset();
}
// Returns the rotation quaternion of the arm in relation to the controller.
public Quaternion GetArmRotation() {
Quaternion local_rotation = hand_.Arm.Basis.Rotation(mirror_z_axis_);
return controller_.transform.rotation * local_rotation;
}
public Hand GetLeapHand() {
return hand_;
}
public void SetLeapHand(Hand hand) {
hand_ = hand;
for (int i = 0; i < fingers.Length; ++i) {
if (fingers[i] != null) {
fingers[i].SetLeapHand(hand_);
fingers[i].SetOffset(GetHandOffset());
}
}
}
public void MirrorZAxis(bool mirror = true) {
mirror_z_axis_ = mirror;
for (int i = 0; i < fingers.Length; ++i) {
if (fingers[i] != null)
fingers[i].MirrorZAxis(mirror);
}
}
public bool IsMirrored() {
return mirror_z_axis_;
}
public HandController GetController() {
return controller_;
}
public void SetController(HandController controller) {
controller_ = controller;
for (int i = 0; i < fingers.Length; ++i) {
if (fingers[i] != null)
fingers[i].SetController(controller_);
}
}
public abstract void InitHand();
public abstract void UpdateHand();
}
我的语法有些问题因为我是新手。
由于
答案 0 :(得分:0)
我不确定我是否能完全理解你的问题。但是,如果您想将数据转换为骨架,请参阅此代码。
// using Mesh, a custom class of mine
public List<GeometryModel3D> drawLeftHand(Hand hand) {
List<GeometryModel3D> list = new List<GeometryModel3D>();
for (int i = 0; i < hand.Fingers.Count; i++)
{
// material = materials[i];
Finger finger = hand.Fingers[i];
List<Bone> allBones = new List<Bone>();
Bone _m = finger.Bone(Leap.Bone.BoneType.TYPE_METACARPAL);
Bone _pp = finger.Bone(Leap.Bone.BoneType.TYPE_PROXIMAL);
Bone _ip = finger.Bone(Leap.Bone.BoneType.TYPE_INTERMEDIATE);
Bone _dp = finger.Bone(Leap.Bone.BoneType.TYPE_DISTAL);
allBones.Add(_m);
allBones.Add(_pp);
allBones.Add(_ip);
allBones.Add(_dp);
for (int j = 0; j < allBones.Count; j++)
{
material = materials[j];
if (allBones[j].IsValid)
{
Vector before = allBones[j].PrevJoint;
GeometryModel3D sphere = new GeometryModel3D(mesh.createSphere(new Point3D(before.x, before.y, before.z)), material);
list.Add(sphere);
Vector after = allBones[j].NextJoint;
GeometryModel3D cylinder = new GeometryModel3D(mesh.createCylinder(new Point3D(before.x, before.y, before.z), new Point3D(after.x, after.y, after.z)), material);
list.Add(cylinder);
if (j == allBones.Count - 1)
{
Vector last = allBones[j].NextJoint;
GeometryModel3D _sphere = new GeometryModel3D(mesh.createSphere(new Point3D(last.x, last.y, last.z)), material);
list.Add(_sphere);
}
}
}
}
return list;
}
这里的要点是按顺序排列每对关节并将它们与骨骼连接起来,以获得像O-o-o-o
这样的东西我无法分享我的整个项目。我很快就会GitHub。但如果您有任何问题可以随意提问。