2011-12-10 36 views
6

Vấn đề của tôi là tôi muốn có thể xoay hình trụ 9 lần. 360/9 là 40 vì vậy tất cả những gì tôi cần làm là xoay 40 độ 9 lần. Tuy nhiên, điều này không hoạt động khi tôi xoay xy lanh lần đầu tiên thay vì 40 độ, nó quay 39,99 độ. Điều này cũng xảy ra ở các vòng quay khác.Xoay đối tượng Unity xoay với giá trị sai

Tôi đang quay bằng cách thực hiện việc này.

if(Input.GetKeyUp("i")) 
     transform.GetChild(m_Section).Rotate(0,40.0f,0); 

Tôi có phiên bản hợp nhất 3.4 không phải là chuyên nghiệp và tôi đang mã hóa bằng C#.

Bất kỳ trợ giúp nào được đánh giá cao như tôi vừa mới bắt đầu cố gắng tìm hiểu sự thống nhất.

Trả lời

1

Xoay vòng Unity3D trong một biểu diễn toán học khá trừu tượng được gọi là quaternion. Tranformation từ và đến góc Euler (những gì bạn nhìn thấy trong trình soạn thảo Unity) liên quan đến một thác các hàm lượng giác và do đó dễ bị làm tròn lỗi đặc biệt là cho loại phao đơn giản.

Để khắc phục sự cố này trong trường hợp của bạn, tôi khuyên bạn nên lưu trữ đối tượng Quaternion ban đầu trước khi bắt đầu xoay và đặt nó ở cuối quá trình. Một số mã giả:

public class RotationController : MonoBehaviour { 
    Quaternion rotationAtStart; 
    int numOfRotations = 0; 

    void rotate() { 
     numOfRotations++; 
     if (numOfRotations == 1) { 
      rotationAtStart = transform.rotation; 
     } else if (numOfRotations < 9) { 
      transform.Rotate (new Vector3 (0,40.0f,0)); 
     } else if (numOfRotations == 9) { 
      transform.rotation = rotationAtStart; 
     } 
    } 
    void Update() { 
     if (numOfRotations < 9) { 
      rotate(); 
     } 
    } 
} 

Tình trạng đặc biệt của 360 ° làm cho phương pháp này ổn định. Đối với ít hơn 360 °, bạn phải sống với các lỗi làm tròn nhỏ. Đối với trường hợp này, tôi sẽ khuyên bạn nên tính toán quaternion mục tiêu Quaternion.RotateTowards và đặt nó ở bước cuối cùng tương tự với trường hợp 360.

Một điều hữu ích khác cho bạn là Animations. Bạn có thể xác định hoạt ảnh mượt mà hoặc theo các bước riêng biệt và chỉ cần gọi GameObject.animation.Play("MyRotation") nếu nhấn "i". Sử dụng AnimationEvent ở cuối để được thông báo khi hoạt ảnh kết thúc.

Và cuối cùng Mathf chứa hàm Approximately đề cập đến vấn đề về dấu chấm phẩy dấu phẩy động.

+0

Nếu tôi đã sử dụng một hình ảnh động như bạn cho rằng sẽ thay đổi các đối tượng trục địa phương hoặc sẽ nó chỉ xoay đối tượng? – Dave

+0

Bạn làm động các thành viên của biến đổi đối tượng trò chơi. transform.rotation ở góc Euler – Kay

+0

Cảm ơn sự giúp đỡ của bạn. Đó là nhiều hơn một cách của bên bước vấn đề hơn là một sửa chữa mặc dù. Tôi sẽ không thể nói nếu (transform.eulerAngles.y == 40.0f) bởi vì mặc dù xoay theo hướng cho một kết quả chính xác hơn vẫn còn lỗi. Tôi chưa thử đề xuất hoạt hình nhưng tôi sẽ cho nó một lượt đi ngay bây giờ. – Dave

0

Hãy xem câu trả lời của Kungfoomanin this post, anh mô tả vấn đề với vòng quay trên 90 độ hoặc ở 90 độ cũng như 270 độ. Ông cung cấp một phần mở rộng mà sẽ luôn luôn tính toán mặt dây chuyền chính xác của Quaternion cho giá trị bạn muốn thiết lập. Có một cái nhìn ở đây:

using UnityEngine; 
using System.Collections; 

public class ExtensionVector3 : MonoBehaviour { 

    public static float CalculateEulerSafeX(float x){ 
     if(x > -90 && x <= 90){ 
      return x; 
     } 

     if(x > 0){ 
      x -= 180; 
     } else { 
      x += 180; 
     } 
     return x; 
    } 

    public static Vector3 EulerSafeX(Vector3 eulerAngles){ 
     eulerAngles.x = CalculateEulerSafeX(eulerAngles.x); 
     return eulerAngles; 
    } 
} 

Và tôi đã sử dụng nó như thế này:

Quaternion newQuat = m_directionalLight.transform.rotation; 
Vector3 nL = new Vector3(ExtensionVector3.CalculateEulerSafeX(xNewValueLight), 
         0, 
         0); 
newQuat.eulerAngles = nL; 

m_directionalLight.transform.rotation = 
    Quaternion.Lerp(m_directionalLight.transform.rotation, 
        newQuat, 
        Time.deltaTime);