Kiểm tra Box2D nếu điểm giao nhau với cơ thể


10

Có cách nào để kiểm tra xem một điểm có giao nhau không?

Ví dụ: giả sử có một cơ thể trên thế giới ở vị trí (100.100).

Có cách nào để kiểm tra xem một điểm tại (100.100) có giao với cơ thể đó không?

Một ví dụ khác có liên quan đến một trò chơi gọi là "PHUN". Trong PHUN, bạn có thể nhấp và kéo các vật thể xung quanh. Làm thế nào bạn sẽ kiểm tra nếu một điểm chuột đang giao nhau?

Câu trả lời:


5

Như với câu trả lời của colin, b2World.Query () là một hàm hữu ích, nếu bạn đặt aabb chỉ bao gồm một điểm duy nhất thì bạn có thể nhận được danh sách các đối tượng có thể chồng lấp điểm đó . Tuy nhiên, do lo ngại về tốc độ, nó chỉ kiểm tra hộp giới hạn (AABB) cho sự trùng lặp không phải lúc nào cũng hoàn toàn chính xác.

Để kiểm tra chính xác một vật cố định (hình dạng, trong các phiên bản cũ hơn), hãy sử dụng hàm b2Fixture.TestPoint (). Vì một cơ thể có thể có nhiều đồ đạc, bạn có thể cần phải lặp qua toàn bộ danh sách để chắc chắn. Kết hợp 2 chức năng đó sẽ cho phép bạn tạo lại chức năng của Phun, nếu bạn muốn.


2

Hãy xem b2QueryCallbackđể tìm những đồ đạc nào chứa một điểm và sử dụng b2MouseJointđể có các đối tượng theo dõi một con chuột. Tôi có một số mã mẫu, nhưng không có thời gian để đơn giản hóa nó cho bạn ngay bây giờ. Nếu bạn cần nó, tôi có thể cung cấp nó sau.


2

Nếu bạn có một điểm bạn biết là bên trong hình thì bạn có thể cắt đường nối nối vị trí chuột với điểm đó với đường biên của hình. Nếu có một số giao điểm lẻ thì điểm nằm bên trong. Nếu có số giao nhau chẵn thì điểm nằm ngoài.

văn bản thay thế
(nguồn: co.uk )

Các chấm màu xanh lá cây là vị trí chuột, màu đỏ là điểm biết bên trong hình dạng.

Có các trường hợp cạnh - ví dụ, nếu đường nối các điểm trùng với một cạnh, chẳng hạn - nhưng điều này sẽ giúp bạn đạt được 90%.


0

Tôi biết câu hỏi này đã cũ nhưng tôi cảm thấy như nó thiếu một câu trả lời đơn giản, dựa trên mã. Vì vậy, đây là:

    /// <summary>
    /// Return if a given position is inside the physical body.
    /// </summary>
    /// <param name="body">Body to test.</param>
    /// <param name="position">Position to check if inside the body.</param>
    /// <returns>If given point is inside the physical body.</returns>
    public bool TestPointCollision(FarseerPhysics.Dynamics.Body body, Vector2 position)
    {
        // get body transformation
        FarseerPhysics.Common.Transform trans;
        body.GetTransform(out trans);

        // iterate fixtures to see if any of them hit the point
        foreach (var fix in body.FixtureList)
        {
            if (fix.Shape.TestPoint(ref trans, ref position))
                return true;
        }

        // if there are no hits, return false
        return false;
    }

Lưu ý rằng đây không phải là Box2D đơn giản mà là Farseer (và trong C #), nhưng nó phải có cùng một API chính xác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.