forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   xors+PhysX=ragdoll (http://forum.boolean.name/showthread.php?t=5237)

Taugeshtu 09.12.2007 16:05

xors+PhysX=ragdoll
 
================
WARNING!!!
================
Так, сразу предупреждаю: копипастить ragdoll Render'a из аналогичного семпла я НЕ НАМЕРЕН. Почему - не спрашивайте. Как говорится, t0p secre|)
================
Теперь по теме:
---
Итак, задача: сделать меш и физическое тело (с написанием всех элементов проблем нет), объеденить все тела (думаю, тоже сам смогу сваять) и сделать функцию приведения в соответствие всех элементов.
Именно с последним пунктом у меня и возникли проблемы. Поначалу использовал вот эту функцию, вычитав ее в справке (эх, пора-бы что ли справку поисправлять, или мне свежую версию найти... Кстати, никто не знает, где брать? Только точный линк, плз) :
pxBodySetBodyEntity ...
С этой коммандой все нормально компилировалось, однако никаких результатов ее работы я лично так и не обнаружил.

Потом глянул в семплы, нашел другой синтаксис:
pxBodySetEntity ...
Вот тут и начались веселости... Т.к. я работаю сразу в Realese режиме, я сразу же словил MAV. Угу, молодец, ничего не скажешь... Включил дебаг, поймал тот же самый MAV на строчке:
pxBodySetEntity a\meshL,a\bodyL

В чем же дело? Код вот такой:

Код:

;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
; |||||||||||||||||||||||||||||
;  . . Initializing . . . . . .
; |||||||||||||||||||||||||||||

Include "b3d_dx9.bb"    ; Include    |-| 0 |_ \|/    lib...
; set Title, Mode, AntiAlias & Tex_Filter
xAppTitle "|)ynamics"
xGraphics3D 800,600,32,0,False
xAntiAlias True
xSetTextureFiltering TF_ANISOTROPIC

If xGetMaxVertexShaderVersion() > -1
    xSetSkinningMethod SKIN_HARDWAREVS
    skinvs = xLoadVertexShader("..\media\skinning.txt", "main", VS_1_1)
Else
    xSetSkinningMethod SKIN_SOFTWARE
EndIf

; |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
; //////////////////////////////////////////////////////////





;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
; |||||||||||||||||||||||||||||
;  . . Player . . . . . . . . .
; |||||||||||||||||||||||||||||

Type arm
    Field name$
    ;-----------|
    Field meshL
    Field bodyL
    Field angL
    ;-----------|
    Field meshU 
    Field bodyU 
    Field angU   
    ;-----------|
    Field rotate 
    Field Aend 
End Type

; |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
; //////////////////////////////////////////////////////////





;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
; |||||||||||||||||||||||||||||
;  . . Creating . . . . . . . .
; |||||||||||||||||||||||||||||
cam = xCreateCamera()
xPositionEntity cam, 0, 0, -40
xCameraRange cam, 0.1, 1000

light1 = xCreateLight(LIGHT_DIRECTION)
xRotateEntity light1, -45, 0, 0

pxCreateWorld(1,"36777-32943-20423-12306-18567")
pxSetGravity(0, -10, 0)

create_pl()

; |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
; //////////////////////////////////////////////////////////





;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
; |||||||||||||||||||||||||||||
; . . Main l00p . . . . . . . .
; |||||||||||||||||||||||||||||

While Not xKeyHit(1)

pxRenderPhysic(30,0)
update_pl()
xRenderWorld()
xFlip()

Wend

; |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
; //////////////////////////////////////////////////////////





;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
; |||||||||||||||||||||||||||||
;  . . Ending . . . . . . . . .
; |||||||||||||||||||||||||||||

End

; |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
; //////////////////////////////////////////////////////////





;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
; |||||||||||||||||||||||||||||
; . . Functions . . . . . . . .
; |||||||||||||||||||||||||||||

;    Create function
Function create_pl()
; Pre-creation
seg=xCreateCylinder()
xScaleEntity seg,1,3.5,1.5
xPositionMesh seg,0,-1.5,0
xHideEntity seg

;===========================
; Creation. Stage 1 == leg_L
;===========================

a.arm=New arm
a\name="leg_l"
a\meshL=xCopyEntity(seg)
xPositionEntity a\meshL,-1.5,3.8,0
; - -
a\bodyL=pxBodyCreateCylinder(0.6,3.5,8,7)
pxBodySetPosition a\bodyL,-1.5,4.5,0
;pxBodySetCMassGlobalposition a\bodyL,-1.5,3.8,0
;- - - - - - - - - - - - - -
a\meshU=xCopyEntity(seg)
xPositionEntity a\meshU,-1.5,6,0
;xEntityParent a\meshL,a\meshU
; - -
a\bodyU=pxBodyCreateCylinder(0.6,3.5,8,7)
pxBodySetPosition a\bodyU,0,10,0
;xHideEntity a\meshU

End Function

;    Update function
Function update_pl()
For a.arm=Each arm
 
pxBodySetEntity a\meshL,a\bodyL
pxBodySetEntity a\meshU,a\bodyU

Next
End Function

; |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
; //////////////////////////////////////////////////////////

Если кто знает, в чем дело, просьба разъяснить... Ну, или рабочим вариантом поделиться... (^_^')

Render 09.12.2007 20:42

Re: xors+PhysX=ragdoll
 
pxBodySetEntity работает только с блитцем. В Ксорсе другая структура памяти, поэтому МАВ. Тебе придётся самому писать ф-ю, делай как в ОДЕ. Определяё углы поворта и позицию боди, а потом ставь в ту же позицию меш.

ЛысыЙ_Чук-Иванчук 09.12.2007 22:04

Re: xors+PhysX=ragdoll
 
Да ты бы 50 раз подумал как можно задать, и потом задавол- ато чтобы понять такое приходится даже мозг подключать.

PositionEntity Entity, pxBodyGetPositionX(body), ...Y, ...Z
RotateEntity Entity. pxBodyGetRotationPitch( body), ... Yaw, ... Roll
RTFM

PS\ Вопрос можно было озвучить так:
Как в Ксорсе Меш поставить в позицию боди.:-)

Taugeshtu 09.12.2007 23:25

Re: xors+PhysX=ragdoll
 
Всем огромное спасибо, плусадын и прочие респекты.
Пошел писать функцию для приведения Ксорсовского ентити под боди. Как напишу - кину сюда.

Taugeshtu 10.12.2007 00:51

xors+PhysX=ragdoll ; Функция приведения в соответствие
 
Как и обещался, выкладываю сюда плод цельных 2-х минут деятельности моего моска... Юзайте на здоровье. За возможные совпадения я не отвечаю.

Код:

;    pxBodySetEntity-заменитель...
Function BodySetEntity(bod,ent)
    Local pX,pY,pZ,rX,rY,rZ

    pX=pxBodyGetPositionX(bod)
    pY=pxBodyGetPositionY(bod)
    pZ=pxBodyGetPositionZ(bod)
    rX=pxBodyGetRotationPitch(bod)
    rY=pxBodyGetRotationYaw(bod)
    rZ=pxBodyGetRotationRoll(bod)

    xPositionEntity ent,pX,pY,pZ
    xRotateEntity ent,rX,rY,rZ
End Function


Taugeshtu 10.12.2007 01:38

Re: xors+PhysX=ragdoll
 
Что-то лагучий мой метод получается... Есть мысль сделать несколько блитцевских ентити, а потом проводить синхрониз уже с ними (вполне верноятно, что это будут простые pivot... Скорее всего так оно и будет)... Но вопрос встает: не будет ли это слишком расточительно?

ЛысыЙ_Чук-Иванчук 10.12.2007 04:43

Re: xors+PhysX=ragdoll
 
Блин чувак ЖЖОш, я находу ето прописывал:), но если так охота функцию(1001% рабочести)
Но изза того что юзается Ксорс могут возникнут дерганости(объект иногда дергается)- у меня возникали(но ето было давно, что сейчас хз)

Function BodySetEntity(bod,ent)
xPositionEntity ent,pxBodyGetPositionX(bod),pxBodyGetPositionн(bod ),pxBodyGetPositionZ(bod)
xRotateEntity ent,pxBodyGetRotationPitch(bod),pxBodyGetRotationY aw(bod),pxBodyGetRotationRoll(bod)
End Function

moka 10.12.2007 09:27

Re: xors+PhysX=ragdoll
 
Глобали не забудьте установить, а то у физ объектов нету локальных, а у энтитей вероятны.

Taugeshtu 10.12.2007 11:01

Re: xors+PhysX=ragdoll
 
Тогда вопрос состоит теперь именно в том, чтобы убрать дерганности...
Я попробовал и через стандартные ентити, однако дерганность осталась...
Придется видимо городить функцию для проверки движения на баг и устранения ошибки (;
Если реализую грамотно и мое чудо даже заработает, то опять-таки выложу здесь.
ПёС.
А "жжу" я именно потому, как мне хотелось в коде видеть не мудреную конструкцию, а что-то вроде:
BodySetEntity a\body,a\mesh
...

moka 10.12.2007 12:48

Re: xors+PhysX=ragdoll
 
Ize'g0re, хм если ставить перемещение после упдейта физики и перед рендером?

Taugeshtu 10.12.2007 13:32

Re: xors+PhysX=ragdoll
 
Там оно и находится... Вернее находилось... (^+^')

jimon 10.12.2007 14:57

Re: xors+PhysX=ragdoll
 
обычно матрица обьекта не обновляется после SetPosition
надо ее ручками обновлять и всьо :) хотя хз

Taugeshtu 10.12.2007 15:30

Re: xors+PhysX=ragdoll
 
Джимон, если возможно, опиши несколько подробнее.
Не совсем понимаю, что есть матрица объекта - имеется ввиду вертексная матрица?
В любом случае, вопрос: как ее обновить ручками?

jimon 10.12.2007 15:44

Re: xors+PhysX=ragdoll
 
ну в ирлихте, к примеру, после вызова setposition сама позиция
обьекта не обновляется

там стоит такой метод в ISceneNode
Код:

virtual void setPosition(const core::vector3df& newpos)
{
        RelativeTranslation = newpos;
}

так же там стоит вот такой метод
Код:

virtual void updateAbsolutePosition()
{
if (Parent )
{
AbsoluteTransformation = Parent->getAbsoluteTransformation() * getRelativeTransformation();
}
else
AbsoluteTransformation = getRelativeTransformation();
}

(AbsoluteTransformation - матрица трансформации node)

тоесть после задания позиции, ее реальное значение не обновляется
и для синхронизации приходилось ручками вызывать updateAbsolutePosition() :)
я хз как в xors ... просто предположил такое

ЛысыЙ_Чук-Иванчук 10.12.2007 20:26

Re: xors+PhysX=ragdoll
 
Цитата:

Сообщение от Ize'g0re
Я попробовал и через стандартные ентити, однако дерганность осталась...

Выпремляй руки!


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

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