2010-12-28 28 views
9

Tôi có Chế độ xem OpenGL ES trong Android được điều khiển bởi ma trận để dịch. Im cố gắng tìm ra cách để có được một gợi ý của động lượng cuộn như được thấy trong ứng dụng bản đồ google hoặc iPhone. Cảm ơn.cuộn mượt/cuộn quán tính/đà di chuyển

Trả lời

11

Nếu vấn đề của bạn là ở 2d, nó là khá đơn giản

  1. Bạn cần phải nhận được thời gian trôi qua trong mỗi khung
  2. onTouch của bạn chức năng sẽ tìm thấy sự tăng tốc của ngón tay của bạn. Tôi quên công thức về cách tăng tốc từ xa. Nó phải là đạo hàm thứ hai của vị trí với một biến thời gian. Nhưng bạn nên luôn luôn chuyển đổi deltaX của bạn, deltaY trong gia tốc. Để làm cho nó dễ dàng, bạn không thực sự cần phải đặt một cái gì đó chính xác ở đó. Chỉnh sửa: Tôi không biết tại sao tôi không nhìn thấy nó nhưng chức năng là tất cả ở đó ...

    acceleration.x = 2 (newposition.x - position.x - speed.x * elapsedTime)/(elapsedTime) * elapsedTime);

  3. Khi bạn đã tăng tốc, bạn có thể đặt vị trí mới của mình bằng mã đó. Đây là động lực vật lý đơn giản trong 2ngày. Với khả năng tăng tốc của bạn, bạn có thể tìm thấy tốc độ của bạn và với tốc độ của bạn, bạn có thể tìm thấy vị trí tiếp theo của bạn.

    speed.x = (float) (mass * acceleration.x * elapsed + speed.x); 
    speed.y = (float) (mass * acceleration.y * elapsed + speed.y); 
    
    
    position.x += mass * acceleration.x/2 * elapsed * elapsed + speed.x * elapsed; 
    position.y += mass * acceleration.y/2 * elapsed * elapsed + speed.y * elapsed; 
    
    
    speed.x *= friction; 
    speed.y *= friction; 
    

Thánh lễ và ma sát sẽ cho phép bạn xác định nhanh như thế nào nó đi và nhanh như thế nào nó sẽ làm chậm của chính nó. Bạn có thể sẽ phải tinh chỉnh mã vì động này không phải là chính xác tốt đẹp nếu bạn phải di chuyển lùi để làm chậm.

Ở cuối mỗi khung, bạn sẽ phải đặt lại gia tốc của mình thành (0,0). Và trên mỗi khung hình mới sau một lần chạm, thậm chí tăng tốc nên được đặt thành thứ gì đó. Nó sẽ hoạt động rất tốt :)

+1

Đã nhìn vào câu trả lời của bạn và tôi tự hỏi làm thế nào bạn có được tốc độ để sử dụng trong gia tốc khi công thức tốc độ của bạn đòi hỏi acceleratioin ... Một phụ thuộc và yêu cầu khác? – Dan

+0

Thay vì tính tốc độ trực tiếp, nó có thể cho kết quả tốt hơn để sử dụng gia tốc. Tốc độ ban đầu và gia tốc là 0. Vì vậy, bạn phải tiết kiệm tốc độ ở đâu đó để thêm nó vào khung sau đây. Tăng tốc là không có gì khác hơn là sự thay đổi giữa mỗi khung hình. Gia tốc có thể là deltaX, deltaY. Tốc độ thực tế sẽ là deltaX * elapsedTime + lastSpeed. Bằng cách này, tốc độ được tính toán chính xác ngay cả khi khung mất nhiều thời gian hoặc một lượng thời gian nhỏ. Các thông số khác giả mạo một chút vật lý để thêm inerty và ma sát. Bạn không thực sự muốn nó cuộn mãi mãi. –

1
  1. Đo tốc độ xem đang di chuyển.
  2. Phát hiện khi người dùng ngừng cuộn.
  3. Giảm dần tốc độ mà chế độ xem cuộn đang cuộn.

Something như thế này:

public void redraw() { 
    myScrollView.ySpeed = myScrollView.lastY-myScrollView.y; 
    myScrollView.xSpeed = myScrollView.lastX-myScrollView.x; 
    if (!userIsScrolling && ySpeed > 0) { 
     ySpeed--; 
    } 
    if (!userIsScrolling && xSpeed > 0) { 
     xSpeed--; 
    } 
    myScrollView.lastY = myScrollView.y; 
    myScrollView.y += ySpeed; 
    myScrollView.lastX = myScrollView.x; 
    myScrollView.x += xSpeed; 
} 

public void userStoppedScrolling() { 
    userIsScrolling = false; 
} 
+0

cảm ơn, bạn có biết chính xác tôi có thể kiểm soát tốc độ mà người dùng đang di chuyển không? Ngay bây giờ nó chỉ tính toán đồng bằng giữa vị trí bắt đầu và vị trí kết thúc của ngón tay người dùng và sau đó đặt nó vào ma trận. – jfisk

+0

Xin lỗi, tôi không biết Android đủ tốt để trợ giúp các chi tiết cụ thể như vị trí chạm và như vậy. – Jumhyn

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