forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Xors3D (http://forum.boolean.name/forumdisplay.php?f=126)
-   -   Столкновение trimesh-to-box (http://forum.boolean.name/showthread.php?t=15369)

Kornival 28.08.2011 03:30

Столкновение trimesh-to-box
 
Не происходит столкновение тримеша с боксом, бокс просто проходит сквозь него. Код:
Цитата:

#include <xors3d.h>
#include <iostream>
#include <math.h>


int APIENTRY WinMain(HINSTANCE instance, HINSTANCE prevInstance, LPSTR commandLine, int commandShow)
{
xGraphics3D(800, 600, 32, false, true);

int camera = xCreateCamera();
xPositionEntity(camera, 0, 10, -40);

int floor = xCreateCube();
xScaleEntity(floor,15,1,15);

int hazar = xLoadAnimMesh("../../../media/Meshes/hazar.b3d");
xPositionEntity(hazar,0,5,0);
xEntityType(hazar,1,true);

xEntityAddTriMeshShape(floor);
xEntityAddBoxShape(hazar,1);

while(!xKeyDown(KEY_ESCAPE))
{
xUpdateWorld(2);
xRenderWorld(2);
xFlip();
}
return 0;
}
Если xEntityAddTriMeshShape(floor) заменить на xEntityAddBoxShape(hazar,0) или грузить неанимированную модель(xLoadMesh), то все работает отлично. Подскажите пожалуйста в чем моя ошибка.

Spy4433 28.08.2011 09:46

Ответ: Столкновение trimesh-to-box
 
Ну наверное просто для animmesh нужно физ тело делать для каждого child

xFindchild
xCountChildren
xGetChild

Kornival 28.08.2011 11:11

Ответ: Столкновение trimesh-to-box
 
Цитата:

Сообщение от Spy4433 (Сообщение 200348)
Ну наверное просто для animmesh нужно физ тело делать для каждого child

Ну вообщето-да, но дело в том, что строка xEntityType(hazar,1,true) по идее должна была решить эту проблему. По крайней мере она заставляет работать коллизии box-to-box(иначе не работали). Если назначить каждому child`у свое физ. тело коллизии работают прекрасно, но сами child`ы при старте отскакивают друг от друга. Я делаю так:
Цитата:

for(int i = 0; i < xCountChildren(hazar); i++)
xEntityAddBoxShape(xGetChild(hazar,i),10);

.Squid 28.08.2011 12:46

Ответ: Столкновение trimesh-to-box
 
Надо еще отфильтровать их столкновения между собой. См. пример с фильтрацией коллизий.
Или использовать одно большое тело на весь анимированный меш, задав размер вручную через xEntityBodyLocalScale, и, возможно, подкорректировав центр с помощью xEntityBodyLocalPosition.

Kornival 28.08.2011 12:55

Ответ: Столкновение trimesh-to-box
 
На С++ примеров с физикой вроде нет, а от того что находиться в этих *.bb файлах у меня рябит в глазах. Буду шаманить.

Kornival 28.08.2011 13:33

Ответ: Столкновение trimesh-to-box
 
Таак, все почти получилось:
Цитата:

for(int i = 0; i < xCountChildren(hazar); i++)
{
xEntityAddBoxShape(xGetChild(hazar,i),10);
xEntitySetCollisionGroup(xGetChild(cube,i),2);
}
xPhysicsSetCollisionFilter(2,2,0);
Но меч(xGetChild(hazar,1)) выпадает из рук хазара(xGetChild(hazar,0)). Можно ли как-то привязать физ. тело xGetChild(hazar,1) к xGetChild(hazar,0)?

Kornival 28.08.2011 18:32

Ответ: Столкновение trimesh-to-box
 
и вопрос в догонку: как проверить соприкасаются ли два объекта?

dsd 28.08.2011 19:40

Ответ: Столкновение trimesh-to-box
 
Цитата:

BBDECL int BBCALL xMeshesBBIntersect ( Entity * entity1,
Entity * entity2
)

Returns true if the specified meshes bounding boxes are currently intersecting.

Deprecated:
Use xEntitiesBBIntersect() instead.
Parameters:
entity1 First entity handle
entity2 Second entity handle

BBDECL int BBCALL xMeshesIntersect ( Entity * entity1,
Entity * entity2
)

Returns true if the specified meshes are currently intersecting.

Parameters:
entity1 First entity handle
entity2 Second entity handle
Может этим?
Еще есть xCollisionX,xCollisionY,z,nx,ny,nz и т.д.

Kornival 28.08.2011 20:05

Ответ: Столкновение trimesh-to-box
 
Цитата:

xMeshesBBIntersect
Цитата:

xMeshesIntersect
По-моему эти функции детектируют пересечение объектов, а у меня им не дают пересекаться физ. тела и мне нужно знать соприкасаются ли объекты(или физ. тела).

Hurrit 28.08.2011 22:06

Ответ: Столкновение trimesh-to-box
 
кстати, мешинтерсект крайне медленный, так что будьте аккуратны.

.Squid 28.08.2011 22:58

Ответ: Столкновение trimesh-to-box
 
/xors3d/docs/html/group__px__contacts.html

Kornival 28.08.2011 22:59

Ответ: Столкновение trimesh-to-box
 
UP
На данный момент актуально 2 вопроса:
1) Как привязать одно физ. тело к другому
2) Как узнать соприкосается ли одно физ. тело с другим(например находится ли кубик на полу)

Kornival 28.08.2011 23:07

Ответ: Столкновение trimesh-to-box
 
Цитата:

/xors3d/docs/html/group__px__contacts.html
Спасибо. Вопрос с привязкой объектов снят. Остался второй.

.Squid 28.08.2011 23:07

Ответ: Столкновение trimesh-to-box
 
Проще скачать Блитц, и глянуть примеры.
В ближайшей ревизии примеры на С++ не появятся. Увы.

UPD. По-моему я дал ответ как раз на второй вопрос.
А привязка происходит автоматически про добавлении тела (xEntityAdd***Shape), либо xEntityAttachBody. В документации все есть.

Kornival 28.08.2011 23:25

Ответ: Столкновение trimesh-to-box
 
Цитата:

Проще скачать Блитц, и глянуть примеры.
Blitz3d? Очень нехочется разбираться с еще одним двигом/ЯПом =(
Цитата:

UPD. По-моему я дал ответ как раз на второй вопрос.
Ааа, вот оно что, я почему-то по ошибке раздел про сочленения открыл :D
Цитата:

А привязка происходит автоматически про добавлении тела (xEntityAdd***Shape), либо xEntityAttachBody. В документации все есть.
Ну это вроде привязка физ. тела к объекту, а мне нужно привязать одно физ. тело к другому, или сделать одно дочерним другого. Вот так как-то.


Часовой пояс GMT +4, время: 15:04.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot