2012-09-26 40 views
6

Phương pháp chuẩn cho chuyển động camera mượt mà trong SceneKit (OpenGL) là gì? Thay đổi thủ công x, y không đủ mượt mà, nhưng sử dụng CoreAnimation tạo ra chuyển động "rung". Các tài liệu trên SceneKit dường như rất hạn chế vì vậy bất kỳ ví dụ sẽ được đánh giá, tôi đang làm điều này:SceneKit chuyển động camera mượt mà

- (void)keyDown:(NSEvent *)theEvent { 
    int key = [theEvent keyCode]; 
    int x = cameraNode.position.x; 
    int y = cameraNode.position.y; 
    int z = cameraNode.position.z; 
    int speed = 4; 
    if (key==123) {//left 
     x-=speed; 
    } else if (key==124) {//right 
     x+=speed; 
    } else if (key==125) {//down 
     y-=speed; 
    } else if (key==126) {//up 
     y+=speed; 
    } 
    //move the camera 
    [SCNTransaction begin]; 
    [SCNTransaction setAnimationDuration: 1.0]; 
    // Change properties 
    cameraNode.position = SCNVector3Make(x, y, z); 
    [SCNTransaction commit]; 
} 
+0

Thử thay đổi tốc độ thành giá trị nhỏ hơn và cũng kiểm tra 'animationTimingFunction' của SCNTransaction. Đảm bảo tên hàm của 'CAMediaTimingFunction' là kCAMediaTimingFunctionLinear để nó không bị xung. – TheAmateurProgrammer

Trả lời

1

Tôi đã thử nghiệm điều này. Điều tốt nhất tôi đã tìm thấy cho đến nay là ghi lại trạng thái của các phím nhập trong trạng thái nội bộ, được sửa đổi bởi keyDown: và keyUp :, và chạy NSTimer để áp dụng chúng. Bộ đếm thời gian sử dụng đồng hồ thời gian thực tế được đo giữa các lần đốt để xác định khoảng cách di chuyển máy ảnh. Bằng cách đó, thời gian bất thường không có quá nhiều hiệu ứng (và tôi có thể gọi phương thức của mình để cập nhật vị trí camera bất cứ lúc nào mà không phải lo lắng về việc thay đổi tốc độ di chuyển của nó).

Mặc dù vậy, phải mất một số công việc để thực hiện hành động này một cách chính xác. keyDown: và keyUp: có một số hành vi đáng ghét khi nói đến đầu vào trò chơi. Ví dụ, lặp lại các phím. Ngoài ra, chúng có thể kích hoạt ngay cả sau khi chế độ xem của bạn bị mất tiêu điểm hoặc ứng dụng của bạn chuyển sang nền, nếu các phím được giữ trong quá trình chuyển đổi. Vv Không phải không thể vượt qua, nhưng gây phiền nhiễu.

Điều tôi chưa làm là thêm tăng tốc và giảm tốc, điều mà tôi nghĩ sẽ hỗ trợ nhận thức về sự mượt mà. Nếu không nó cảm thấy khá tốt.

+0

Tôi đã làm cách nào đó tương tự cách tiếp cận - ngoại trừ tôi không sử dụng bộ đếm thời gian - tôi chỉ cập nhật vị trí Camera trong đại diện cập nhật nó hoạt động khá mượt mà trong hầu hết các lần - tuy nhiên khi FPS giảm chuyển động không mượt mà khi sử dụng Metal làm trình kết xuất đồ họa - khi sử dụng OpenGL làm trình kết xuất đồ họa luôn mượt mà - nhưng FPS giảm thường xuyên hơn trên OpenGL ... – ColdSteel

8

Để giảm thiểu các phong trào xung (do sự lặp lại chìa khóa), bạn có thể sử dụng một "easeOut" timingFunction :

//move the camera 
[SCNTransaction begin]; 
[SCNTransaction setAnimationDuration: 1.0]; 
[SCNTransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]]; 
// Change properties 
cameraNode.position = SCNVector3Make(x, y, z); 
[SCNTransaction commit]; 

điều đó nói rằng, điều tốt nhất để làm ở đây có lẽ là để quản lý một vị trí đích (một vector3) cho mình và cập nhật vị trí của máy ảnh ở mỗi khung hình để đi đến mục tiêu này thông suốt.

Các vấn đề liên quan