package musclide.sensor; import javafx.beans.property.DoubleProperty; import javafx.beans.property.SimpleDoubleProperty; import org.OpenNI.SkeletonJoint; import org.OpenNI.StatusException; import java.util.HashMap; /** * Copyright (c) 2012 Wataru MIYAGUNI * <p/> * MIT License * <p/> * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * <p/> * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * <p/> * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ public class Speaker { protected MuscleSensor sensor = null; protected int userId; private DoubleProperty headX = new SimpleDoubleProperty(); private DoubleProperty headY = new SimpleDoubleProperty(); private DoubleProperty headZ = new SimpleDoubleProperty(); private DoubleProperty neckX = new SimpleDoubleProperty(); private DoubleProperty neckY = new SimpleDoubleProperty(); private DoubleProperty neckZ = new SimpleDoubleProperty(); private DoubleProperty torsoX = new SimpleDoubleProperty(); private DoubleProperty torsoY = new SimpleDoubleProperty(); private DoubleProperty torsoZ = new SimpleDoubleProperty(); private DoubleProperty waistX = new SimpleDoubleProperty(); private DoubleProperty waistY = new SimpleDoubleProperty(); private DoubleProperty waistZ = new SimpleDoubleProperty(); private DoubleProperty leftCollarX = new SimpleDoubleProperty(); private DoubleProperty leftCollarY = new SimpleDoubleProperty(); private DoubleProperty leftCollarZ = new SimpleDoubleProperty(); private DoubleProperty leftShoulderX = new SimpleDoubleProperty(); private DoubleProperty leftShoulderY = new SimpleDoubleProperty(); private DoubleProperty leftShoulderZ = new SimpleDoubleProperty(); private DoubleProperty leftElbowX = new SimpleDoubleProperty(); private DoubleProperty leftElbowY = new SimpleDoubleProperty(); private DoubleProperty leftElbowZ = new SimpleDoubleProperty(); private DoubleProperty leftWristX = new SimpleDoubleProperty(); private DoubleProperty leftWristY = new SimpleDoubleProperty(); private DoubleProperty leftWristZ = new SimpleDoubleProperty(); private DoubleProperty leftHandX = new SimpleDoubleProperty(); private DoubleProperty leftHandY = new SimpleDoubleProperty(); private DoubleProperty leftHandZ = new SimpleDoubleProperty(); private DoubleProperty leftFingerTipX = new SimpleDoubleProperty(); private DoubleProperty leftFingerTipY = new SimpleDoubleProperty(); private DoubleProperty leftFingerTipZ = new SimpleDoubleProperty(); private DoubleProperty rightCollarX = new SimpleDoubleProperty(); private DoubleProperty rightCollarY = new SimpleDoubleProperty(); private DoubleProperty rightCollarZ = new SimpleDoubleProperty(); private DoubleProperty rightShoulderX = new SimpleDoubleProperty(); private DoubleProperty rightShoulderY = new SimpleDoubleProperty(); private DoubleProperty rightShoulderZ = new SimpleDoubleProperty(); private DoubleProperty rightElbowX = new SimpleDoubleProperty(); private DoubleProperty rightElbowY = new SimpleDoubleProperty(); private DoubleProperty rightElbowZ = new SimpleDoubleProperty(); private DoubleProperty rightWristX = new SimpleDoubleProperty(); private DoubleProperty rightWristY = new SimpleDoubleProperty(); private DoubleProperty rightWristZ = new SimpleDoubleProperty(); private DoubleProperty rightHandX = new SimpleDoubleProperty(); private DoubleProperty rightHandY = new SimpleDoubleProperty(); private DoubleProperty rightHandZ = new SimpleDoubleProperty(); private DoubleProperty rightFingerTipX = new SimpleDoubleProperty(); private DoubleProperty rightFingerTipY = new SimpleDoubleProperty(); private DoubleProperty rightFingerTipZ = new SimpleDoubleProperty(); private DoubleProperty leftHipX = new SimpleDoubleProperty(); private DoubleProperty leftHipY = new SimpleDoubleProperty(); private DoubleProperty leftHipZ = new SimpleDoubleProperty(); private DoubleProperty leftKneeX = new SimpleDoubleProperty(); private DoubleProperty leftKneeY = new SimpleDoubleProperty(); private DoubleProperty leftKneeZ = new SimpleDoubleProperty(); private DoubleProperty leftAnkleX = new SimpleDoubleProperty(); private DoubleProperty leftAnkleY = new SimpleDoubleProperty(); private DoubleProperty leftAnkleZ = new SimpleDoubleProperty(); private DoubleProperty leftFootX = new SimpleDoubleProperty(); private DoubleProperty leftFootY = new SimpleDoubleProperty(); private DoubleProperty leftFootZ = new SimpleDoubleProperty(); private DoubleProperty rightHipX = new SimpleDoubleProperty(); private DoubleProperty rightHipY = new SimpleDoubleProperty(); private DoubleProperty rightHipZ = new SimpleDoubleProperty(); private DoubleProperty rightKneeX = new SimpleDoubleProperty(); private DoubleProperty rightKneeY = new SimpleDoubleProperty(); private DoubleProperty rightKneeZ = new SimpleDoubleProperty(); private DoubleProperty rightAnkleX = new SimpleDoubleProperty(); private DoubleProperty rightAnkleY = new SimpleDoubleProperty(); private DoubleProperty rightAnkleZ = new SimpleDoubleProperty(); private DoubleProperty rightFootX = new SimpleDoubleProperty(); private DoubleProperty rightFootY = new SimpleDoubleProperty(); private DoubleProperty rightFootZ = new SimpleDoubleProperty(); private HashMap<SkeletonJoint, Muscle> skeletonJoints = new HashMap<SkeletonJoint, Muscle>(); public Speaker(int id, MuscleSensor sensor) { this.userId = id; this.sensor = sensor; } public boolean isTracking() { return sensor.isTracking(userId); } private void updateSkeletonJoint(SkeletonJoint joint, DoubleProperty x, DoubleProperty y) { Muscle point = sensor.getSkeletonJointPosition(userId, joint); if (point == null) { return; } skeletonJoints.put(joint, point); x.set(point.getX()); y.set(point.getY()); } private Muscle getSkeletonPosition(SkeletonJoint joint) { Muscle p = skeletonJoints.get(joint); if (p != null) { return p; } return new Muscle(); } /** * コメントアウトしてるところは、骨格情報取るところでエラーでたので * 多分対応してない場所 * * @throws StatusException */ public void update() throws StatusException { updateSkeletonJoint(SkeletonJoint.HEAD, headX, headY); updateSkeletonJoint(SkeletonJoint.NECK, neckX, neckY); updateSkeletonJoint(SkeletonJoint.TORSO, torsoX, torsoY); //updateSkeletonJoint(SkeletonJoint.WAIST, waistX, waistY); //updateSkeletonJoint(SkeletonJoint.LEFT_COLLAR, leftCollarX, leftCollarY); updateSkeletonJoint(SkeletonJoint.LEFT_SHOULDER, leftShoulderX, leftShoulderY); updateSkeletonJoint(SkeletonJoint.LEFT_ELBOW, leftElbowX, leftElbowY); //updateSkeletonJoint(SkeletonJoint.LEFT_WRIST, leftWristX, leftWristY); updateSkeletonJoint(SkeletonJoint.LEFT_HAND, leftHandX, leftHandY); //updateSkeletonJoint(SkeletonJoint.LEFT_FINGER_TIP, leftFingerTipX, leftFingerTipY); //updateSkeletonJoint(SkeletonJoint.RIGHT_COLLAR, rightCollarX, rightCollarY); updateSkeletonJoint(SkeletonJoint.RIGHT_SHOULDER, rightShoulderX, rightShoulderY); updateSkeletonJoint(SkeletonJoint.RIGHT_ELBOW, rightElbowX, rightElbowY); //updateSkeletonJoint(SkeletonJoint.RIGHT_WRIST, rightWristX, rightWristY); updateSkeletonJoint(SkeletonJoint.RIGHT_HAND, rightHandX, rightHandY); //updateSkeletonJoint(SkeletonJoint.RIGHT_FINGER_TIP, rightFingerTipX, rightFingerTipY); updateSkeletonJoint(SkeletonJoint.LEFT_HIP, leftHipX, leftHipY); updateSkeletonJoint(SkeletonJoint.LEFT_KNEE, leftKneeX, leftKneeY); //updateSkeletonJoint(SkeletonJoint.LEFT_ANKLE, leftAnkleX, leftAnkleY); updateSkeletonJoint(SkeletonJoint.LEFT_FOOT, leftFootX, leftFootY); updateSkeletonJoint(SkeletonJoint.RIGHT_HIP, rightHipX, rightHipY); updateSkeletonJoint(SkeletonJoint.RIGHT_KNEE, rightKneeX, rightKneeY); //updateSkeletonJoint(SkeletonJoint.RIGHT_ANKLE, rightAnkleX, rightAnkleY); updateSkeletonJoint(SkeletonJoint.RIGHT_FOOT, rightFootX, rightFootY); } public Muscle head() { return getSkeletonPosition(SkeletonJoint.HEAD); } public Muscle neck() { return getSkeletonPosition(SkeletonJoint.NECK); } public Muscle torso() { return getSkeletonPosition(SkeletonJoint.TORSO); } public Muscle waist() { return getSkeletonPosition(SkeletonJoint.WAIST); } public Muscle leftCollar() { return getSkeletonPosition(SkeletonJoint.LEFT_COLLAR); } public Muscle leftShoulder() { return getSkeletonPosition(SkeletonJoint.LEFT_SHOULDER); } public Muscle leftElbow() { return getSkeletonPosition(SkeletonJoint.LEFT_ELBOW); } public Muscle leftWrist() { return getSkeletonPosition(SkeletonJoint.LEFT_WRIST); } public Muscle leftHand() { return getSkeletonPosition(SkeletonJoint.LEFT_HAND); } public Muscle leftFingerTip() { return getSkeletonPosition(SkeletonJoint.LEFT_FINGER_TIP); } public Muscle rightCollar() { return getSkeletonPosition(SkeletonJoint.RIGHT_COLLAR); } public Muscle rightShoulder() { return getSkeletonPosition(SkeletonJoint.RIGHT_SHOULDER); } public Muscle rightElbow() { return getSkeletonPosition(SkeletonJoint.RIGHT_ELBOW); } public Muscle rightWrist() { return getSkeletonPosition(SkeletonJoint.RIGHT_WRIST); } public Muscle rightHand() { return getSkeletonPosition(SkeletonJoint.RIGHT_HAND); } public Muscle rightFingerTip() { return getSkeletonPosition(SkeletonJoint.RIGHT_FINGER_TIP); } public Muscle leftHip() { return getSkeletonPosition(SkeletonJoint.LEFT_HIP); } public Muscle leftKnee() { return getSkeletonPosition(SkeletonJoint.LEFT_KNEE); } public Muscle leftAnkle() { return getSkeletonPosition(SkeletonJoint.LEFT_ANKLE); } public Muscle leftFoot() { return getSkeletonPosition(SkeletonJoint.LEFT_FOOT); } public Muscle rightHip() { return getSkeletonPosition(SkeletonJoint.RIGHT_HIP); } public Muscle rightKnee() { return getSkeletonPosition(SkeletonJoint.RIGHT_KNEE); } public Muscle rightAnkle() { return getSkeletonPosition(SkeletonJoint.RIGHT_ANKLE); } public Muscle rightFoot() { return getSkeletonPosition(SkeletonJoint.RIGHT_FOOT); } public DoubleProperty headXProperty() { return headX; } public DoubleProperty headYProperty() { return headY; } public DoubleProperty headZProperty() { return headZ; } public DoubleProperty neckXProperty() { return neckX; } public DoubleProperty neckYProperty() { return neckY; } public DoubleProperty neckZProperty() { return neckZ; } public DoubleProperty torsoXProperty() { return torsoX; } public DoubleProperty torsoYProperty() { return torsoY; } public DoubleProperty torsoZProperty() { return torsoZ; } public DoubleProperty waistXProperty() { return waistX; } public DoubleProperty waistYProperty() { return waistY; } public DoubleProperty waistZProperty() { return waistZ; } public DoubleProperty leftCollarXProperty() { return leftCollarX; } public DoubleProperty leftCollarYProperty() { return leftCollarY; } public DoubleProperty leftCollarZProperty() { return leftCollarZ; } public DoubleProperty leftShoulderXProperty() { return leftShoulderX; } public DoubleProperty leftShoulderYProperty() { return leftShoulderY; } public DoubleProperty leftShoulderZProperty() { return leftShoulderZ; } public DoubleProperty leftElbowXProperty() { return leftElbowX; } public DoubleProperty leftElbowYProperty() { return leftElbowY; } public DoubleProperty leftElbowZProperty() { return leftElbowZ; } public DoubleProperty leftWristXProperty() { return leftWristX; } public DoubleProperty leftWristYProperty() { return leftWristY; } public DoubleProperty leftWristZProperty() { return leftWristZ; } public DoubleProperty leftHandXProperty() { return leftHandX; } public DoubleProperty leftHandYProperty() { return leftHandY; } public DoubleProperty leftHandZProperty() { return leftHandZ; } public DoubleProperty leftFingerTipXProperty() { return leftFingerTipX; } public DoubleProperty leftFingerTipYProperty() { return leftFingerTipY; } public DoubleProperty leftFingerTipZProperty() { return leftFingerTipZ; } public DoubleProperty rightCollarXProperty() { return rightCollarX; } public DoubleProperty rightCollarYProperty() { return rightCollarY; } public DoubleProperty rightCollarZProperty() { return rightCollarZ; } public DoubleProperty rightShoulderXProperty() { return rightShoulderX; } public DoubleProperty rightShoulderYProperty() { return rightShoulderY; } public DoubleProperty rightShoulderZProperty() { return rightShoulderZ; } public DoubleProperty rightElbowXProperty() { return rightElbowX; } public DoubleProperty rightElbowYProperty() { return rightElbowY; } public DoubleProperty rightElbowZProperty() { return rightElbowZ; } public DoubleProperty rightWristXProperty() { return rightWristX; } public DoubleProperty rightWristYProperty() { return rightWristY; } public DoubleProperty rightWristZProperty() { return rightWristZ; } public DoubleProperty rightHandXProperty() { return rightHandX; } public DoubleProperty rightHandYProperty() { return rightHandY; } public DoubleProperty rightHandZProperty() { return rightHandZ; } public DoubleProperty rightFingerTipXProperty() { return rightFingerTipX; } public DoubleProperty rightFingerTipYProperty() { return rightFingerTipY; } public DoubleProperty rightFingerTipZProperty() { return rightFingerTipZ; } public DoubleProperty leftHipXProperty() { return leftHipX; } public DoubleProperty leftHipYProperty() { return leftHipY; } public DoubleProperty leftHipZProperty() { return leftHipZ; } public DoubleProperty leftKneeXProperty() { return leftKneeX; } public DoubleProperty leftKneeYProperty() { return leftKneeY; } public DoubleProperty leftKneeZProperty() { return leftKneeZ; } public DoubleProperty leftAnkleXProperty() { return leftAnkleX; } public DoubleProperty leftAnkleYProperty() { return leftAnkleY; } public DoubleProperty leftAnkleZProperty() { return leftAnkleZ; } public DoubleProperty leftFootXProperty() { return leftFootX; } public DoubleProperty leftFootYProperty() { return leftFootY; } public DoubleProperty leftFootZProperty() { return leftFootZ; } public DoubleProperty rightHipXProperty() { return rightHipX; } public DoubleProperty rightHipYProperty() { return rightHipY; } public DoubleProperty rightHipZProperty() { return rightHipZ; } public DoubleProperty rightKneeXProperty() { return rightKneeX; } public DoubleProperty rightKneeYProperty() { return rightKneeY; } public DoubleProperty rightKneeZProperty() { return rightKneeZ; } public DoubleProperty rightAnkleXProperty() { return rightAnkleX; } public DoubleProperty rightAnkleYProperty() { return rightAnkleY; } public DoubleProperty rightAnkleZProperty() { return rightAnkleZ; } public DoubleProperty rightFootXProperty() { return rightFootX; } public DoubleProperty rightFootYProperty() { return rightFootY; } public DoubleProperty rightFootZProperty() { return rightFootZ; } public Muscle muscleHead() { return Muscle.sub(head(), neck()); } public Muscle muscleRightForearm() { return Muscle.sub(rightHand(), rightElbow()); } public Muscle muscleRightUpperArm() { return Muscle.sub(rightElbow(), rightShoulder()); } public Muscle muscleLeftForearm() { return Muscle.sub(leftHand(), leftElbow()); } public Muscle muscleLeftUpperArm() { return Muscle.sub(leftElbow(), leftShoulder()); } public boolean isRightArmIsStraight() { return muscleRightForearm().isStraight(muscleRightUpperArm()); } public boolean isLeftArmIsStraight() { return muscleLeftForearm().isStraight(muscleLeftUpperArm()); } public boolean isRightArmIsBentRightAngle() { return muscleRightUpperArm().isOrthogonal(muscleRightForearm()); } public boolean isLeftArmIsBentRightAngle() { return muscleLeftUpperArm().isOrthogonal(muscleLeftForearm()); } public boolean isBothForearmIsStraight() { return muscleLeftForearm().isParallel(muscleRightForearm()); } /** * <pre> * * \ ○ / * | * | * / \ * * </pre> * @return */ public boolean owataPoseDetected() { boolean angle = isRightArmIsStraight() && isLeftArmIsStraight(); boolean position = (rightHand().getY() < head().getY()) && (leftHand().getY() < head().getY()); return angle && position; } /** * * <pre> * _ ○ _ * | | | * | * / \ * * </pre> * * * @return */ public boolean hangerPoseDetected() { boolean angle = isRightArmIsBentRightAngle() && isLeftArmIsBentRightAngle() && isBothForearmIsStraight(); boolean position = (rightHand().getY() > rightElbow().getY()) && (leftHand().getY() > leftElbow().getY()); double rightAngle = Math.toDegrees(Math.acos(muscleRightForearm().dot(muscleRightUpperArm()))); double leftAngle = Math.toDegrees(Math.acos(muscleLeftForearm().dot(muscleLeftUpperArm()))); double botharm = Math.toDegrees(Math.acos(muscleRightForearm().dot(new Muscle(1.0f, 0.0f, 0.0f)))); double botharm2 = Math.toDegrees(Math.acos(muscleLeftForearm().dot(new Muscle(1.0f, 0.0f, 0.0f)))); System.out.println(rightAngle + " " + leftAngle + " " + botharm + " " + botharm2); return angle && position; } /** * <pre> * ○ * -- | -- * | * / \ * * </pre> * @return */ public boolean kakashiPoseDetected() { boolean angle = isRightArmIsStraight() && isLeftArmIsStraight() && muscleRightForearm().isParallel(new Muscle(1.0f, 0.0f, 0.0f)) && muscleLeftForearm().isParallel(new Muscle(1.0f, 0.0f, 0.0f)); boolean position = (rightHand().getY() > head().getY()) && (leftHand().getY() > head().getY()); return angle && position; } /** * <pre> * | ○ | * - | - * | * / \ * </pre> * @return */ public boolean showtimePoseDetected() { boolean angle = isRightArmIsBentRightAngle() && isLeftArmIsBentRightAngle() && isBothForearmIsStraight(); boolean position = (rightHand().getY() < rightElbow().getY()) && (leftHand().getY() < leftElbow().getY()); return angle && position; } }