Ode Mesh


Автор Сообщение

бывалый
Группа: Участники
Сообщений: 36
Добавлено: 30-05-2018 11:53
как использовать OdeAddTriMesh для freeform или actor ?
я так понял это надо указать меш тоесть его вытянуть из freeform но в xtreme3d нет таких функц

Big Boss
Группа: Администраторы
Сообщений: 719
Добавлено: 30-05-2018 14:48
В OdeAddTriMesh передается индекс меша, это делается так:

OdeStaticCreate(freeform);
for (i = 0; i < FreeformMeshObjectsCount(freeform); i = i+1)
OdeAddTriMesh(freeform, i);

В SDK есть пример (physics.gmk). Для Actor такой возможности нет, потому что в ODE нет поддержки анимированных мешей. Я вообще не уверен, что она бывает в игровых физ. движках (если не считать soft body physics, но это уже другое). Максимум, что можно сделать для актеров - это ragdoll (тоже есть пример, ragdoll.gmk).

бывалый
Группа: Участники
Сообщений: 36
Добавлено: 30-05-2018 15:49
OdeTerrainCreate с терейном есть пример или как юзать ?
спс большое за ответы )

Big Boss
Группа: Администраторы
Сообщений: 719
Добавлено: 30-05-2018 16:08
Просто вызываешь OdeTerrainCreate(terrain). Это отдельный тип тел, так что OdeStaticCreate вызывать не надо. Примера нет, но могу добавить в следующей версии, если нужно.

бывалый
Группа: Участники
Сообщений: 36
Добавлено: 30-05-2018 16:16
hds = BmpHDSCreate('data/terrain/heightmap.bmp');
BmpHDSSetInfiniteWarp(hds, 0);
terrain = TerrainCreate(global.scene);
TerrainSetHeightData(terrain, hds);

TerrainSetTileSize(terrain, 32);
TerrainSetTilesPerTexture(terrain, 8);
TerrainSetQualityDistance(terrain, 100);
ObjectSetScale(terrain, 1, 1, 0.1);
terrainY = 4;
ObjectSetPosition(terrain, -128, terrainY, 128);
ObjectRotate(terrain, 90, 0, 0);
OdeTerrainCreate(terrain);

написал такое и 0 емоции (

Big Boss
Группа: Администраторы
Сообщений: 719
Добавлено: 31-05-2018 11:38
Странно, у меня работает:



Вот мой код создания terrain:

hds = BmpHDSCreate('data/terrain/heightmap.bmp');
BmpHDSSetInfiniteWarp(hds, false);
terrain=TerrainCreate(global.scene);
TerrainSetHeightData(terrain, hds);
TerrainSetTileSize(terrain, 32);
TerrainSetTilesPerTexture(terrain, 8);
TerrainSetQualityDistance(terrain, 100);
TerrainSetQualitystylе(terrain, hrsFullGeometry);
TerrainSetMaxCLodTriangles(terrain, 10000);
TerrainSetCLodPrecision(terrain, 50);
TerrainSetOcclusionFrameSkip(terrain, 0);
TerrainSetOcclusionTesselate(terrain, totTesselateIfVisible);
ObjectSetPosition(terrain, -50, 0, 50);
ObjectSetScale(terrain, 1, 1, 0.05);
ObjectRotate(terrain,90,0,0);
MaterialCreate('mTerrain','data/terrain/autumn.jpg');
MaterialSetOptions('mTerrain', false, true);
MaterialCreate('detmap','data/terrain/detmap.jpg');
MaterialSetTextureScale('detmap', 100, 100);
MaterialSetSecondTexture('mTerrain','detmap');
ObjectSetMaterial(terrain,'mTerrain');
terrBody = OdeTerrainCreate(terrain);

Могу пример выложить, если надо.

Единственное, что заметил - ODE не работает с бесконечным ландшафтом (BmpHDSSetInfiniteWarp(hds, true)) - движок просто вылетает.

бывалый
Группа: Участники
Сообщений: 36
Добавлено: 31-05-2018 15:23
1)спс за пример , думаю крафт будет по лучше и вот то что получилось :
2)напиши о минусах ode )))
3)совместим ли raycast от xtreme3d с ode и другими физ движками ?


Big Boss
Группа: Администраторы
Сообщений: 719
Добавлено: 31-05-2018 16:42
Минусы:
- Меши не сталкиваются с плоскостями, цилиндрами, ландшафтом и другими мешами. Похоже, это ограничение движка проверки столкновений старой версии ODE, и сделать с этим ничего нельзя - разве что обновить ODE, но это непростая задача, придется многое перелопатить в GLScene.
- По моим впечатлениям, сложно сделать нормальный контроллер персонажа. Обычно он делается при помощи прямого управления скоростью тела - я реализовал такое в примере physics.gmk из SDK, но результат неидеален. Например, игрок с трудом поднимается по лестнице и иногда немного застревает в стенах. Хотя, в принципе, для простых игр такого контроллера достаточно.

Big Boss
Группа: Администраторы
Сообщений: 719
Добавлено: 31-05-2018 17:05
А рейкаст вообще с ODE никак не связан, он работает с объектами Xtreme3D. То есть, мы можем как угодно перемещать и поворачивать объекты, хоть физикой, хоть вручную - рейкаст использует трансформацию из Xtreme3D, и ему все равно, откуда она берется.

бывалый
Группа: Участники
Сообщений: 36
Добавлено: 31-05-2018 19:24
Для контроллера лучше использовать капсулу и задать ей трение скольжение и лучше посмотреть пример кода как сделано на unity3d либо других движках ))
но вообще я согласен Ode себя странно ведет, надеюсь крафт все исправит

Big Boss
Группа: Администраторы
Сообщений: 719
Добавлено: 31-05-2018 21:10
Ну да, можно капсулу или эллипсоид, главное - вручную задавать ей скорость. Обычно физ. движки на такое нормально реагируют, скольжение само собой происходит благодаря работе солвера. Например, я на своем движке dmech сделал практически идеальный контроллер, без застреваний и проваливаний, с нормальным движением по лестницам и наклонным поверхностям (для него даже движущиеся/вращающиеся платформы можно сделать при желании). В ODE почему-то та же логика срабатывает иначе. Посмотрим, как получится в Крафте.

Big Boss
Группа: Администраторы
Сообщений: 719
Добавлено: 01-06-2018 19:49
Попробовал написать контроллер персонажа на Kraft (в архиве скомпилированная демка на Python + исходник):
http://gecko0307.siteme.org/xtreme3d/files/examples/x3d-dev-kraft-demo.7z



Получилось гораздо лучше, чем с ODE. Удалось сделать прыжок и движение по наклонному полу, но не по лестницам. В dmech я использую для этого объект-сенсор под ногами персонажа, который сообщает о столкновениях, но не реагирует на них - так можно понять, касается ли игрок лестницы или наклонного пола, когда на рейкаст полагаться нельзя. Но в Kraft, к сожалению, таких сенсоров нет. Придется их как-то реализовать сторонними средствами, либо использовать вместо честных лестниц рампы.
Впрочем, могут быть и другие способы. С сенсорами просто самый простой и эффективный.

бывалый
Группа: Участники
Сообщений: 36
Добавлено: 02-06-2018 01:04
За тестил и да круто , с лестницами есть ещё варианты :
Написать код для контроллера step off set как в unity3d , либо дополнительный Коллайдер использовать повернутый как на скринш..


Big Boss
Группа: Администраторы
Сообщений: 719
Добавлено: 02-06-2018 11:49
Придумал, как справиться с лестницами без сенсоров - просто делаю дополнительный рейкаст на шаг впереди в направлении движения и усредняю высоту пола в этой точке с высотой пола под персом. И дальше уже усредненная высота используется для сравнения с радиусом коллайдера + небольшого смещения. Мне кажется, в Unity step offset так же реализован. По крайней мере, получился похожий параметр смещения, который контролирует, насколько крутой склон персонаж может преодолеть.
Обновил демку, ссылка та же.

 

Offtop.ru © 2003