- Home /
Question by
judy18 · Mar 13, 2017 at 06:55 AM ·
rotationblendshapesmousedrag
Rotate an object with blendshapes
Hi, I have a 3D object with blendshapes attached that I imported from Maya. I am trying to get the object's x and y position to rotate as user drags the mouse. Here is the script I am using below. It works on a regular unity 3d game object but won't work on my blendhshape object. I parented the blendshape object to an empty game object and tried attaching the script to the parent but still doesn't work. using UnityEngine; using System.Collections;
public class RotateObj : MonoBehaviour {
public GameObject target;
public float spinDurationFactor = 1.0f;
public float xSpinDeltaFactor = 1f;
public float ySpinDeltaFactor =1f;
private float mouseXInitial;
private float mouseXCurrent;
private float mouseYInitial;
private float mouseYCurrent;
private float deltaX;
private float deltaY;
// Use this for initialization
void Start () {}
// Update is called once per frame
public void Update () {}
void OnMouseDown()
{
// Record initial mouse position
mouseXInitial = Input.mousePosition.x;
mouseYInitial = Input.mousePosition.y;
}
void OnMouseDrag()
{
mouseXCurrent = Input.mousePosition.x;
deltaX = (mouseXCurrent - mouseXInitial) * xSpinDeltaFactor;
if (mouseXCurrent != mouseXInitial)
{
target.transform.RotateAround(Vector3.zero, Vector3.up, -deltaX);
}
mouseXInit = Input.mousePosition.x;
mouseYCurrent = Input.mousePosition.y;
deltaY = (mouseYCurrent - mouseYInitial ) * ySpinDeltaFactor;
if (mouseYCurrent != mouseYInitial)
{
target.transform.RotateAround(Vector3.zero, Vector3.right, deltaY);
}
mouseYInitial = Input.mousePosition.y;
}
void OnMouseUp()
{
StartCoroutine(spinDown());
}
float l = Mathf.Floor(spinDurationFactor * (Mathf.Abs(deltaX)>Mathf.Abs(deltaY) ? Mathf.Abs(deltaX):Mathf.Abs(deltaY)) + 0.0f);
float currentSpeedX;
float currentSpeedY;
for (int j = 0; j < (int)l; j++)
{
currentSpeedX = ((Mathf.Cos(j/((int)l/Mathf.PI)) + 1.0f)/2.0f) * deltaX;
//currentSpeedX = -Mathf.Log(j/l) * deltaX;
target.transform.RotateAround(Vector3.zero, Vector3.up, -currentSpeedX);
currentSpeedY = ((Mathf.Cos(j/((int)l/Mathf.PI)) + 1.0f)/2.0f) * deltaY;
//currentSpeedY = -Mathf.Log(j/l) * deltaY;
target.transform.RotateAround(Vector3.zero, Vector3.right, currentSpeedY);
yield return new WaitForSeconds(0.01f);
}
}
.
public IEnumerator smoothReorient(Quaternion _finalOrientation, float _framesCount) {
float frames = _framesCount;
Quaternion from = target.transform.localRotation;
Quaternion to = _finalOrientation;
float t;
for (int j = 0; j < (int)frames; j++)
{
t = ((Mathf.Cos(j/(frames/Mathf.PI)) + 1.0f)/2.0f);
target.transform.localRotation = Quaternion.Slerp(from, to, 1 - t);
yield return new WaitForSeconds(0.01f);
}
}
Comment
Your answer
![](https://koobas.hobune.stream/wayback/20220612113039im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
Rotate something smoothly by dragging? 2 Answers
Flip over an object (smooth transition) 3 Answers
Velocity bug with hinge joints forces in C# 0 Answers
Have an object bounce off colliders instead of drift 2 Answers
Network.Instatiate Problem 0 Answers