Search…

Chipmunk - Phần 5: Ray Casting

30/09/20202 min read
Giới thiệu về Ray Casting và hiện thực một Ray Casting với Cocos2d-x 3.4.

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 tia
  • position2: hướng của tia
  • maxFraction: độ 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
ss_1

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_anglem_node. Thuộc tính m_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 position1position2 với giá trị của maxFraction 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 Casting positionFraction 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 đến positionFraction, 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.
ss_2

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);
ss_3

 

IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024