forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Xors3D (http://forum.boolean.name/forumdisplay.php?f=126)
-   -   Xors3D + PhysX Проблемы (http://forum.boolean.name/showthread.php?t=12008)

Randomize 23.02.2010 03:18

Xors3D + PhysX Проблемы
 
По истечении некоторого времени решил вернутся к B3D чтоб так сказать немножко поигратся. Сразу появились проблемы.
За попытки создания Trimesh или Hull меня нещадно награждали MAV`ом.
Спасибо Knightmare за его терпение, теперь все проблемы решены.
Теперь по подробнее:
Xors3D хоть и похож на Blitz3D, но работает иначе (во многих местах даже грамотнее).
Cледовательно и работает с физ. враппером он иначе.
Корень проблемы - банки данных Blitz3D.
Лечится так:
  1. Качаем последние DLL
    http://mycop.xors3d.com/px.zip
  2. Меняем в Decls все символы * на % (просто заменой в Блокноте)
    * - Банк данных Blitz3D
    % - число (хендл или айди) который как раз нам нужен
    !!! Важно понимать, что после этого враппер будет непригоден для использования в чистом Blitz3D

Ganociy 03.03.2011 16:44

Ответ: Xors3D + PhysX Проблемы
 
Ссылка уже не работает, у кого-нибудь это осталось? Потому что у меня тоже не работает хулл.

Leowey 03.03.2011 18:10

Ответ: Xors3D + PhysX Проблемы
 
Цитата:

Меняем в Decls все символы * на % (просто заменой в Блокноте)
Не? (и ещё несколько символов)

Ganociy 03.03.2011 18:26

в деклс враппера физики?

Блин! Что делать?..

Randomize 04.03.2011 22:44

Ответ: Xors3D + PhysX Проблемы
 
Вложений: 4
Так. Связка PhysX+Xors3D ныне не актуальна, но если вы всё же предпочитаете PhysX буллету, то вам надо знать:
Автор враппера (Render) положил болт на враппер и он больше не разрабатывается.
Исходники можно лицезреть тут: http://mycop.xors3d.com/public/PXW/PhysXWrapper.zip

Последняя версия PhysX для Xors3D лежит тут: http://mycop.xors3d.com/public/PXW/PXW_Xors3d.zip

Тримеш делать так:
PHP код:

Function xCreateTrimesh(mesh%,mass#=0)
If mesh <> 0
    Local VBs 
xGetMeshVB(mesh)
    
Local VB_sizes xGetMeshVBSize(mesh)
    
Local IBs xGetMeshIB(mesh )
    
Local IB_sizes=xGetMeshIBSize(mesh)
    
Local Trimesh=pxCreateTriMesh(VBsIBsVB_sizesIB_sizesmass)
    Return 
Trimesh
End 
If
End Function 

Хулл делать так:
PHP код:

Function xCreateHull(mesh%,mass#)
If mesh <> 0
    Local VB 
xGetMeshVB(mesh)
    
Local VB_size xGetMeshVBSize(mesh)
    
Local cube_body pxBodyCreateHull(VBVB_sizemass)
    Return 
cube_body
End 
If
End Function 

На всякий случай прикладываю эти файлы дабы жили дольше и не затерялись со временем.

St_AnGer 04.03.2011 23:12

Ответ: Xors3D + PhysX Проблемы
 
ух... Жалко нельзя поставить 100 штук "полезно". Наконец то меня перестанут доставать вопросами "где взять драйвера для физикс враппера?", "где взять враппер?", "где взять исходники?", "а как выглядит функция тримеша?" и т.д. :-D

burovalex 24.07.2012 21:48

Ответ: Xors3D + PhysX Проблемы
 
По мере изучение такого союза сам написал пару функций. Инклюдим и пользуемся.
Код:

Function xConvertTerrainToPx(terrain,sx#,sy#,sz#)
        nSize = xTerrainSize (terrain)
        bank = CreateBank(nSize*nSize*4)
        For z=1 To nSize-1
                For x = 1 To nSize-1
                        y# = xTerrainHeight(terrain,x,z)
                        PokeFloat bank,(z*(nSize)+x)*4,y
                Next
        Next
        body# = pxCreateTerrain(nSize,bank, sx, sy, sz)
        FreeBank(bank)
        Return body
End Function
;--------------------------------------------------------------------
;;===========================xMesh to Hull======================================================
Function xConvertMeshToHull%(mesh%, mass#)

    Local nsurf = xCountSurfaces(mesh)
    Local nvert = 0
    For ns = 0 To nsurf-1
        Local surf = xGetSurface(mesh,ns)
        nvert = nvert + xCountVertices(surf)
    Next
        vbank = CreateBank(nvert*4*3)
    nv = 0
    For ns = 0 To nsurf-1
        surf = xGetSurface(mesh,ns)
        nvv = xCountVertices(surf)
        For nvc = 0 To nvv - 1
            PokeFloat vbank,nv*12+0,xVertexX(surf,nvc)
            PokeFloat vbank,nv*12+4,xVertexY(surf,nvc)
            PokeFloat vbank,nv*12+8,xVertexZ(surf,nvc)
            nv = nv+1
        Next
    Next
    Local bbb%= pxBodyCreateHull(vbank, nvert, mass)
    FreeBank vbank
    Return bbb
End Function

;============================xMesh to triMesh===================================================
Function xConvertMeshToTrimesh(mesh, mass# = 0)
          nsurf = xCountSurfaces(mesh)
        nvert = 0
        nface=0
        For ns = 0 To nsurf-1
                Local surf = xGetSurface(mesh,ns)
                nface = nface+xCountTriangles(surf)
                nvert = nvert +xCountVertices(surf)
        Next

        fbank = CreateBank(nface*4*3)
        nf = 0
        vbank = CreateBank(nvert*4*3)
        nv = 0
        pnvv = 0
        For ns = 0 To nsurf-1
                surf = xGetSurface(mesh,ns)
                nfv = xCountTriangles(surf)
                For nfc = 0 To nfv -1
                        PokeInt fbank,nf*12+0,xTriangleVertex(surf,nfc,0)+pnvv+ns
                        PokeInt fbank,nf*12+4,xTriangleVertex(surf,nfc,1)+pnvv+ns
                        PokeInt fbank,nf*12+8,xTriangleVertex(surf,nfc,2)+pnvv+ns
                        nf=nf+1
                Next

                nvv = xCountVertices(surf)
                For nvc = 0 To nvv - 1
                        PokeFloat vbank,nv*12+0,xVertexX(surf,nvc)*xEntityScaleX(mesh)
                        PokeFloat vbank,nv*12+4,xVertexY(surf,nvc)*xEntityScaleY(mesh)
                        PokeFloat vbank,nv*12+8,xVertexZ(surf,nvc)*xEntityScaleZ(mesh)
                        nv = nv+1
                Next
                pnvv=pnvv+nvv-1
        Next
        bbb%=pxCreateTriMesh(vbank, fbank, nvert, nface,mass)
        FreeBank vbank
        FreeBank fbank
        Return bbb%
End Function

Function pxEntityScaleX#(ent%) 
    row=0
    el1# = xGetMatElement(ent,row,0) 
    el2# = xGetMatElement(ent,row,1) 
    el3# = xGetMatElement(ent,row,2) 
    Return Sqr(el1*el1+el2*el2+el3*el3) 
End Function
Function pxEntityScaleY#(ent%) 
    row=1
    el1# = xGetMatElement(ent,row,0) 
    el2# = xGetMatElement(ent,row,1) 
    el3# = xGetMatElement(ent,row,2) 
    Return Sqr(el1*el1+el2*el2+el3*el3) 
End Function
Function pxEntityScaleZ#(ent%)
    row=2
    el1# = xGetMatElement(ent,row,0) 
    el2# = xGetMatElement(ent,row,1) 
    el3# = xGetMatElement(ent,row,2) 
    Return Sqr(el1*el1+el2*el2+el3*el3) 
End Function
;-----------------------------------------------------------------------------------
Function xpxBodySetEntity(ent,bod,x#=0,y#=0,z#=0)
xPositionEntity ent,pxBodyGetPositionX(bod)+x,pxBodyGetPositionY(bod)+y,pxBodyGetPositionZ(bod)+z
xRotateEntity ent,pxBodyGetRotationPitch(bod),pxBodyGetRotationYaw(bod),pxBodyGetRotationRoll(bod)
End Function


tirarex 10.05.2013 14:04

Ответ: Xors3D + PhysX Проблемы
 
использую эту связку двигов и вот недавно встал вопрос : работает ли cloth и если да то можно код как создать тряпку в ксорсе с помощью физикса

LLI.T.A.L.K.E.R. 12.05.2014 06:59

Ответ: Xors3D + PhysX Проблемы
 
pxCreateTriMesh
Почитал, что автор Render для BMax-а написал отдельный загрузчик Ткани pxCreateClothSpec

Сейчас я просто заменил строку Функции xConvertMeshToTrimesh на аналогичную загрузочку Ткани.
Ошибок загрузки нет.
Но при pxUpdateCloth() - ошибка.
Предполагаю что к Ткани не закреплёна Модель.

PHP код:

Global cloth_mesh=xLoadMesh("..\Media\pol.b3d")
cloth_tex=xLoadTexture("..\Media\rug512.jpg")
xEntityTexture cloth_mesh,cloth_tex
xEntityFX cloth_mesh
,16    ;ЭТО ВАЖНО чтобы плоскость отображалась с двух сторон
xScaleMesh cloth_mesh
,0.1,0.1,0.1
xPositionMesh cloth_mesh
,0,8,0

Global cloth_body=xConvertMeshToCloth(cloth_mesh)
Global 
cloth_nvert=pxClothGetNumVertices(cloth_body)    ;оптимизация чтобы не
Global cloth_vbank=CreateBank(cloth_nvert*4*3)        ;повторять в цикле

pxClothAttachVertexToPos
(cloth_body,399,-1,8,0)
pxClothAttachVertexToPos(cloth_body,440,1,8,0)
pxClothSetBendingStiffness(cloth_body,1)

~ ~ ~
Function 
xConvertMeshToCloth(mesh)
    
nsurf=xCountSurfaces(mesh)
    
nvert=0
    nface
=0
    
For ns=0 To nsurf-1
        Local surf
=xGetSurface(mesh,ns)
        
nface=nface+xCountTriangles(surf)
        
nvert=nvert +xCountVertices(surf)
    
Next
    
    fbank
=CreateBank(nface*4*3)
    
nf=0
    vbank
=CreateBank(nvert*4*3)
    
nv=0
    pnvv
=0
    
For ns=0 To nsurf-1
        surf
=xGetSurface(mesh,ns)
        
nfv=xCountTriangles(surf)
        For 
nfc=0 To nfv -1
            PokeInt fbank
,nf*12+0,xTriangleVertex(surf,nfc,0)+pnvv+ns
            PokeInt fbank
,nf*12+4,xTriangleVertex(surf,nfc,1)+pnvv+ns
            PokeInt fbank
,nf*12+8,xTriangleVertex(surf,nfc,2)+pnvv+ns
            nf
=nf+1
        Next
        
        nvv
=xCountVertices(surf)
        For 
nvc=0 To nvv-1
            PokeFloat vbank
,nv*12+0,xVertexX(surf,nvc)*xEntityScaleX(mesh)
            
PokeFloat vbank,nv*12+4,xVertexY(surf,nvc)*xEntityScaleY(mesh)
            
PokeFloat vbank,nv*12+8,xVertexZ(surf,nvc)*xEntityScaleZ(mesh)
            
nv=nv+1
        Next
        pnvv
=pnvv+nvv-1
    Next
    bbb
%=[b]pxCreateClothSpec[/b](vbank,fbank,nvert,nface)
    
FreeBank vbank
    FreeBank fbank
    
Return bbb%
End Function 

эта писанина ныне не актуальна:

Пока вот думаю как закрепить Ткань на Модель.
Есть функция pxClothGetNormals(Cloth%, nbank*), но не знаю как её применить (в архиве bmax-а должен быть пример).

Посмотрел в исходник враппера, там в файле Blitzpx.cpp
на 3105 строке:
regularCloth->entityData = 0;

почему то не приписывается Entity к Cloth, хотя можно было бы (наверное) через функцию (при создании Ткани)


Обновление Ткани и её Модели читать ниже \/

LLI.T.A.L.K.E.R. 12.05.2014 07:37

Ответ: Xors3D + PhysX Проблемы
 
Загрузку Модели и создания Ткани читайте выше ^

УРА!
Заработала Ткань в Xors3D!

Благодаря moka написал функцию повертексного обновления Модели исходя из точек Тела.

Полёт нормальный! На Celeron, GeforceFX 5700 - квс(fps) снижается лишь на 15. (с ~102 на ~87)


PHP код:

{КОД}
    
pxRenderPhysic(60,0)
    
pxClothUpdateMesh(cloth_body,cloth_mesh)
{
КОД}


Function 
pxClothUpdateMesh(body,mesh)
    
pxClothGetVertexPos(body,cloth_vbank,cloth_nvert)
    
surf=xGetSurface(mesh,0)
    For 
nvc=0 To cloth_nvert-1
        xVertexCoords surf
,nvc,PeekFloat(cloth_vbank,nvc*12+0),PeekFloat(cloth_vbank,nvc*12+4),PeekFloat(cloth_vbank,nvc*12+8)
    
Next
End 
Function 

медиа ресурсы искать в PhysX-архиве Blitz_samples (там ещё папка Cloth(PRO) лежит)

для google: Xors3D PhysX wrapper pxCreateCloth pxUpdateCloth pxClothSetVertexPos pxClothGetNormals

tirarex 12.05.2014 15:04

Ответ: Xors3D + PhysX Проблемы
 
Мав на bbb%=pxCreateClothSpec(vbank,fbank,nvert,nface)

LLI.T.A.L.K.E.R. 12.05.2014 19:28

Ответ: Xors3D + PhysX Проблемы
 
Вложений: 2
Цитата:

Сообщение от tirarex (Сообщение 280521)
Мав на bbb%=pxCreateClothSpec(vbank,fbank,nvert,nface)

но у меня на двух ЭВМ работает (winxp)

Сделал наглядный пример .bb и .exe - форматы.
Можно проверить на разных системах.

скопируйте Userlibs\Blitzpx.dll в основную папку примера
(а для использования в Blitz3D в папку его Userlibs)

tirarex 12.05.2014 19:32

Ответ: Xors3D + PhysX Проблемы
 
Может я что то не так делаю , скинь семпл .

LLI.T.A.L.K.E.R. 12.05.2014 20:05

Ответ: Xors3D + PhysX Проблемы
 
Проверил на третьем ЭВМ - Win7 тоже всё норм. Думаю не будет только у меня одного работать, с моими конфигурациями.

tirarex 12.05.2014 20:12

Ответ: Xors3D + PhysX Проблемы
 
Заработало только с твоим деклз !


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

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