Ray Casting
Trong xử lý vật lý, ray casting là kĩ thuật giúp xác định sự va chạm của một vật thể với một tia cho trước. Tia cho trước này được xây dựng bởi 2 thành phần là điểm bắt đầu và điểm hướng tới. Bất kì vật thể nào mà tia này đi qua thì được xem là va chạm với tia. Kĩ thuật này thường được ứng dụng trong việc xây dựng đường đạn bay, hướng nhìn ...
Thành phần
Input
Là thành phần mà khởi tạo của tia
position1
: điểm bắt đầu tiaposition2
: hướng của tiamaxFraction
: độ lớn của tia, hay một cách hiểu khác là phạm vi tối đa va chạm được xét
Output
Thành phần nhận được khi Ray Casting bị một đối tượng cắt qua.
- normal
- fraction
Ví dụ
Trong Chipmunk, Ray Casting thực hiện như sau.
float m_angle = 0.0f; DrawNode* m_node; float lengthRayCasting = 400.0f; Vec2 position1 = Vec2(visibleSize.width / 2, visibleSize.height / 2); Vec2 d(lengthRayCasting * cosf(m_angle), L * sinf(m_angle)); Vec2 position2 = position1 + d; Vec2 positionFraction = position2 ; float fraction = 1000.0f; PhysicsRayCastCallbackFunc func = [&positionFraction , &fraction ] (PhysicsWorld& world, const PhysicsRayCastInfo& info, void* data)->bool { if (friction > info.fraction) { positionFraction = info.contact; friction = info.fraction; } return true; }; m_world->rayCast(func, position1 , position2, nullptr); m_node->drawSegment(position1 , positionFraction , 1, Color4F(1.0f, 0.0f, 0.0f, 1.0f)); if (position2 != positionFraction) { m_node->drawDot(positionFraction , 2, Color4F(1.0f, 1.0f, 1.0f, 1.0f)); } addChild(m_node);
Phân tích
- Dòng 1-2: Khởi tạo hai thuộc tính là
m_angle
vàm_node
. Thuộc tínhm_node
có tác dụng vẽ lên màn hình như đoạn thẳng - Dòng 4-7: Khởi tạo
position1
vàposition2
với giá trị củamaxFraction
là 1. - Dòng 9: Khởi tạo
positionFraction
. Bình thường khi chưa có đối tượng nào cắt qua Ray CastingpositionFraction
chính là position2. Nếu có đối tượng cắt qua thì đây là tọa độ của fraction. - Dòng 10-17: Đây là phương thức có chức năng xác định tọa độ của fraction (
positionFraction
) khi có đối tượng nào đó cắt qua Ray Casting. - Dòng 19: Khởi tạo Ray Casting trong Physics World.
- Dòng 20: Vẽ một đường thẳng từ điểm
position1
đếnpositionFraction
, có bán kính là 1 và có giá trị màu là (1.0f, 0.0f, 0.0f, 1.0f). - Dòng 22-24: Nếu tìm được tọa độ của fraction, vẽ một điểm ngay tại tọa độ này.
- Dòng 25: Thêm đối tượng
m_node
vào layer hiện tại.
Hoặc:
#define MAX_MULTI_RAYCAST_NUM 5 Vec2 positionFraction[MAX_MULTI_RAYCAST_NUM]; int num = 0; PhysicsRayCastCallbackFunc func = [&positionFraction, &num] (PhysicsWorld& world, const PhysicsRayCastInfo& info, void* data)->bool { if (num < MAX_MULTI_RAYCAST_NUM) { positionFraction[num++] = info.contact; } return true; }; m_world->rayCast(func, position1, position2, nullptr); m_node->drawSegment(position1, position2, 1, Color4F(1.0f, 0.0f, 0.0f, 1.0f)); for (int index = 0; index < num; ++index) { m_node->drawDot(positionFraction[index], 2, Color4F(1.0f, 1.0f, 1.0f, 1.0f)); } addChild(m_node);