Ir al contenido

publicidad

Foto

Mover partes de un modelo 3D (Meshes - XNA)


Este tema ha sido archivado. Esto significa que no puedes responder en este tema.
13 respuestas en este tema

  • Ollydbg

  • Charger

  • vida restante: 100%
  • Registrado: 05 sep 2008
  • Mensajes: 6.259
#1

Escrito 03 marzo 2009 - 01:57

Holas de nuevo.

Poco a poco le voy cogiendo el truqillo a modelar y texturizar en Blender.
Dispongo del siguiente modelo:

http://img7.imagesha...=prueba8xna.jpg

El problema surge con lo siguiente:
Mi modelo consta basicamente de 3 "Meshes":

* La carroceria
* Las dos ruedas delanteras
* Las dos ruedas traseras

Mi intención es que por lo menos las dos ruedas delanteras "se muevan" ya bien sea a la izquierda o bien sea a la derecha cuando mueves "el volante", no sé si me explico.

Tal y como tengo ahora el modelo, aunque el "coche" gire hacia la derecha, las ruedas "no giran hacia la derecha". (Si, lo sé, me explico fatal X-D )

¿Tengo que hacer "algo especial" en Blender? (He leido no se que de los "Bones")

¿Cómo incluyo ese comportamiento dentro del código XNA?

La rutina que me pinta un "modelo" es la típica:
[code:1]Matrix[] transforms = new Matrix[m.Bones.Count];
m.CopyAbsoluteBoneTransformsTo(transforms);
foreach (ModelMesh mesh in m.Meshes)
{
foreach (BasicEffect effect in mesh.Effects)
{
effect.EnableDefaultLighting();
effect.PreferPerPixelLighting = true;
effect.World = world;
effect.Projection = projection;
effect.View = view;
}
mesh.Draw();
}
[/code]

¿Alguna idea? ¿HowTo? ¿Estrategia a seguir? ¿etc?

Saludos.

  • Ellolo17

  • Máscara de Majora

  • vida restante: 100%
  • Registrado: 16 nov 2006
  • Mensajes: 6.208
#2

Escrito 03 marzo 2009 - 12:45

Esque si te fijas en las ruedas del coche al girar, ves que no es como un carro en el que gira el eje delantero por el medio, si no que giran las ruedas independientemente por su eje y.

Asi que esto es lo que tienes que hacer:

1_ Modelo de la carroceria
2_ Modelo de rueda

Cargar carroceria
cargar 4 veces el modelo de la rueda -y si las pones en un array indicando el coche al que pertenecen y su posicion relativa respecto el origen de coordenadas del coche para recolocarlas mas facilmente mejor. Las ruedas 1 y 2 de un coche serian las delanteras y por lo tanto las que giran-

Si se pulsa la tecla izquierda
Si el angulo y de la rueda > 45 -asi limitamos a que solo pueda girar hasta 45 grados-
angulo y de la rueda 1 --
angulo y de la rueda 2 --
fin si
fin si

Y para la tecla derecha lo mismo pero al reves.

Con esto deberias poder controlar el giro de las ruedas al girar el coche.
Y luego recuerda girar sobre el eje x constantemente las ruedas para que vayan girando sobre si mismas.

Un saludo y que te funcione ;)



PD: Yo no programo en XNA, si no en DarkBasic, pero el algoritmo es el mismo ;)

#3

Escrito 03 marzo 2009 - 14:19

Conocéis algún tutorial de vehículos que trate sobre estos temas?

Es algo que me interesa aprender a medio plazo. Si es en C++, con modelos de Blender, mejor que mejor, pero si es en otro lenguaje o con otros modelos, supongo que será igualmente fácil de traducir.

No importa que sea en inglés.

  • Ellolo17

  • Máscara de Majora

  • vida restante: 100%
  • Registrado: 16 nov 2006
  • Mensajes: 6.208
#4

Escrito 03 marzo 2009 - 18:59

Mmm..yo lo que conozco ya comento que es en Darkbasic... pero al ser basic al fin y al cabo es facilito de entender como funcionaría...

Vamos a ver, hay un codigo comentado y todo eso de 769 lineas de codigo con el que se hace un escenario pequeño, un vehiculo simple -una caja y 4 esferas- y se controlan ls fisicas, las camaras y todo.

[code:1]` This code was downloaded from The Game Creators
` It is reproduced here with full permission
` http://www.thegamecreators.com

REM CAR PHYSICS OPEN SOURCE - THE MASKED CODER ( 2002 )
` ------------------------------------------------------------------------------------
` NOTE BY MUDDLEGLUM 2007
` this version seems to have had a track added by me EARLIER ( muddleglum)
` For this file , I have replaced the 3ds jeep with a box, wheels swith spheres.
` note that the keyboard controls can be restored. This has no changing grip levels with g force effects
` and no summing up of the grip change due to steerangle and braking.
` but it is perfectly functional and convincing without that.
` to add pitching forward/aft detect each program loop, the change occuring to 'velociy# ' variable .
` this is proportional to the forward/ aft g force
` in experiment, it took some complicated additions to get the body flowing smoothly ( shock absorbed.spring like)
` over the sharp matrix, ,, the wheels still follow the actual sharp matrix surface.
` the problem with this code is that a matrix is not ideal for a detailed landscape or track. being square in form
` still, many matrices can be combined with modern computers.
` -------------------------------------------------------------------------------------

hide mouse
set display mode 800,600,16
sync on
sync rate 28
draw to front


`load image "grass1.bmp",1

gosub makeimageg
gosub makeimager

ink rgb(255,255,255),0

landsize = 5000 : rem size of matrix - 5000 x 5000 .
rem Make a matrix landscape
make matrix 1,landsize,landsize,30,30 : rem size of each tile on matrix .

rem Prepare matrix with grass texture
prepare matrix texture 1,1,1,1

rem fill matrix with image 1 and set height to 0
fill matrix 1,0,1

`TO MAKE A FLAT WORLD ..REM OUT THIS LINE . THE 'TRACK' MUDDLEGLUM ADDED WILL THEN BE VISIBLE
randomize matrix 1, 40 : update matrix 1

` make a 'car' with wheels

make object box 1,5,2,8

make object sphere 2,3.5
scale object 2,40,100,100
texture object 2,2

make object sphere 3,3.5
scale object 3,40,100,100
texture object 3,2

make object sphere 4,3.5
scale object 4,40,100,100
texture object 4,2

make object sphere 5,3.5
scale object 5,40,100,100
texture object 5,2



REM *** ALL VARIABLES ARE GLOBAL **********************************************************


rem physics variables

rem change these physics variables for various effects on the jeep .
rem drag and resistance together go to make a maximum velocity allowed . No maximum speed capping is needed .
DRAG# = .2 : rem wind resistance which slows the jeep down proprtionally to forward velocity .
RESISTANCE# = 4.0 : rem rolling resistance (slows the jeep down when free rolling)
frontgrip# = -40 : rem cornering stiffness front = front slippyness of jeep .lower the number the less traction there is .
reargrip# = -40 : rem cornering stiffness rear = rear slippyness of jeep . lower the number the less traction there is .
CAR1_cartype_mass# = 450 : rem effects the sluggishness of the handling
CAR1_cartype_inertia# = 450 : rem how much momentum is generated by the jeep . Usual to set this equal to mass .
whichdrive = 0 : rem 0 = four wheel drive (best handling) : 1 = front wheel drive : 2 = rear wheel drive



rem leave these variables pretty much as they are .
delta_t# = 0.01
M_PI# = 3.1415926
tempcar = reargrip#
tempcaf = frontgrip#
MAX_GRIP# = 2.0 : rem seems to have little efect
MULT# = 57 : rem =180 / M_PI#
MULT2# = .1 : rem MULT2# = fish tailing factor
CAR1_cartype = 1
CAR1_cartype_b# = 1.0
CAR1_cartype_c# = 1.0
CAR1_cartype_wheelbase# = CAR1_cartype_b# + CAR1_cartype_c#
CAR1_cartype_h# = 1.0
CAR1_cartype_width# = 1.5
CAR1_cartype_length# = 3.0
CAR1_cartype_wheellength# = 0.7
CAR1_cartype_wheelwidth# = 0.3
CAR1_car_position_wc_x# = 2000:`landsize / 2 : rem start position x in world frame (centre of matrix)
CAR1_car_position_wc_y# = 2000:`landsize / 2 : rem start position z in world frame (centre of matrix)
CAR1_car_velocity_wc_x# = 0
CAR1_car_velocity_wc_y# = 0
CAR1_car_angle# = 0
CAR1_car_angularvelocity# = 0
CAR1_car_steerangle# = 0
CAR1_car_throttle# = 0
CAR1_car_brake# = 0
front_slip = 0
rear_slip = 0




rem how much the jeep body rolls
rollscalefactor# = 89000 : rem 49000 .

minspeed = 10 : rem check if jeep is below the speed of 10, if so, then stop jeep. (counteracts drifting)

wheelpitchangle# = 0 : rem angle by which the wheels are rotated down, to simulate rolling forward as the jeep moves forward.


rem position jeep on the matrix at the start .
position object (1),CAR1_car_position_wc_x#,0,CAR1_car_position_wc_y#
gosub alignjeep

rem position camera in centre of the world frame just behind the jeep .
position camera landsize / 2,object position y(1)+10,(landsize / 2) - 40


camflag = 1 : rem camera tracking or stationary flag. 0 = stationary : 1 = follow jeep .
cameraspeed = 10 : rem speed of camera tracking .
set camera range 1,12000

gosub maketrack

color backdrop RGB(0,188,200)
fog on
fog color RGB(0,188,200)



REM **** MAIN LOOP *******************************************************************************
REM **** MAIN LOOP *******************************************************************************
while mouseclick()=0


if inkey$()="r":`reset
CAR1_car_position_wc_x# = 2000:`landsize / 2 : rem start position x in world frame (centre of matrix)
CAR1_car_position_wc_y# = 2000:`
endif

set cursor 0,0


print " CAR PHYSICS DEMO OPEN SOURCE ( The Masked Coder 2002 )-- PLUS "
`print
print "FPS = ";screen fps()
print
print "F1 = Drop Camera"
print "F2 = Camera Follow"
print
print " F3- 4WD, F4 - Front, F5 - rear wheel "

print
print "1 - 2 = Front amount of grip = ",tempcaf
print "3 - 4 = Rear amount of grip = ",tempcar
print
print "5 - 6 = Increase / Decrease MASS = ",CAR1_cartype_mass#
print "7 - 8 = Increase / Decrease INERTIA = ",CAR1_cartype_inertia#


if SCANCODE() = 59 then camflag = 0 : rem check for F1 key pressed .
if SCANCODE() = 60 then camflag = 1 : rem check for F2 key pressed .


if SCANCODE() = 61 then whichdrive = 0 : rem check for F3 key pressed .
if SCANCODE() = 62 then whichdrive = 1 : rem check for F4 key pressed .
if SCANCODE() = 63 then whichdrive = 2 : rem check for F5 key pressed .


if SCANCODE() = 2 then tempcaf = tempcaf + 2 : rem check for 1 key pressed .
if SCANCODE() = 3
tempcaf = tempcaf - 2 : rem check for 2 key pressed .
endif

if SCANCODE() = 4 then tempcar = tempcar + 2 : rem check for 3 key pressed .
if SCANCODE() = 5
tempcar = tempcar - 2 : rem check for 4 key pressed .
endif


if SCANCODE() = 6
CAR1_cartype_mass# = CAR1_cartype_mass# - 10 : rem check for 5 key pressed .
if CAR1_cartype_mass#<1 then CAR1_cartype_mass#=1
endif
if SCANCODE() = 7
CAR1_cartype_mass# = CAR1_cartype_mass# + 10 : rem check for 6 key pressed .
endif

if SCANCODE() = 8
CAR1_cartype_inertia# = CAR1_cartype_inertia# - 10 : rem check for 7 key pressed .
if CAR1_cartype_inertia#<1 then CAR1_cartype_inertia#=1
endif
if SCANCODE() = 9 then CAR1_cartype_inertia# = CAR1_cartype_inertia# + 10 : rem check for 8 key pressed .



gosub checkkeys : rem check for cursor keys pressed .
gosub carphysics : rem rotate and place jeep in the world frame based on the physics engine .
gosub updatecamera : rem track jeep with camera .

sync
endwhile


rem Free your obejct from memory
for a = 0 to 500
if object exist(a) = 1 then delete object a
`if image exist(a) = 1 then delete image a
next a
end
rem End the program ********************************************************************************************
rem End the program ********************************************************************************************




rem check for cursor keys pressed and set flags accordingly .
rem this way of checking for keys means the system only has to poll the keyboard once per pass of the code .
rem just my prefered way of reading keys .
checkkeys:

if inkey$()="a"
upkeypressed=1
else
upkeypressed=0
endif

if inkey$()="s"
downkeypressed=1
else
downkeypressed=0
endif

if leftkey()=1
leftkeypressed=1
else
leftkeypressed=0
endif

if rightkey()=1
rightkeypressed=1
else
rightkeypressed=0
endif
return



rem this subroutine places all 4 wheels under the jeep, relative to the jeeps orientation .
positionwheels:

wheelonground# = 2.2 : rem height offset so wheels sit on the ground .

rem orientate wheels to match jeep .
for a = 2 to 5
set object to object orientation a,1
next a

rem place front left wheel .
position object 2,object position x(1),object position y(1),object position z(1)
move object 2,4.4
turn object left 2,90
move object 2,2.5
turn object right 2,90
pitch object down 2,90
move object 2,wheelonground#
pitch object up 2,90

rem place front right wheel .
position object 3,object position x(1),object position y(1),object position z(1)
move object 3,4.4
turn object right 3,90
move object 3,2.5
turn object left 3,90
pitch object down 3,90
move object 3,wheelonground#
pitch object up 3,90

rem place rear right wheel .
position object 4,object position x(1),object position y(1),object position z(1)
turn object left 4,180
move object 4,3.3
turn object left 4,180
turn object right 4,90
move object 4,2.5
turn object left 4,90
pitch object down 4,90
move object 4,wheelonground#
pitch object up 4,90

rem place rear left wheel .
position object 5,object position x(1),object position y(1),object position z(1)
turn object left 5,180
move object 5,3.3
turn object left 5,180
turn object left 5,90
move object 5,2.5
turn object right 5,90
pitch object down 5,90
move object 5,wheelonground#
pitch object up 5,90


rem rotate front left wheel for steering and pitch for rolling along .
turn object right 2,CAR1_car_steerangle# * (180 / M_PI#)
if downkeypressed = 0
if velocity_x# > minspeed then pitch object down 2,wheelpitchangle#
endif

rem rotate front right wheel for steering and pitch for rolling along .
turn object right 3,CAR1_car_steerangle# * (180 / M_PI#)
if downkeypressed = 0
if velocity_x# > minspeed then pitch object down 3,wheelpitchangle#
endif

rem pitch rear wheels for rolling on ground .
if downkeypressed = 0
if velocity_x# > minspeed then pitch object down 4,wheelpitchangle#
endif

if downkeypressed = 0
if velocity_x# > minspeed then pitch object down 5,wheelpitchangle#
endif
return




rem CAR PHYSICS ALGORITHM BASED ON MARCO MONSTERS ORIGINAL C++ SOURCE CODE . ( cheers marco ) :)

CARPHYSICS:
sn# = Sin(CAR1_car_angle# * MULT#)
cs# = Cos(CAR1_car_angle# * MULT#)

rem velocity_x# = forward speed of jeep .
velocity_x# = (cs# * CAR1_car_velocity_wc_y#) + (sn# * CAR1_car_velocity_wc_x#)
rem velocity_y# = sideways(lateral) speed of jeep .
velocity_y# = ((0-sn#) * CAR1_car_velocity_wc_y#) + (cs# * CAR1_car_velocity_wc_x#)

rem stop the car shuddering at different speeds - different grip levels at different speeds .
reargrip# = tempcar
frontgrip# = tempcaf
CAR1_cartype_b# = 1.0
CAR1_cartype_c# = 1.0
if velocity_x# < 30 then reargrip# = -10 : frontgrip# = -10 : CAR1_cartype_b# = 1.0 : CAR1_cartype_c# = 1.0
if velocity_x# < 10 then reargrip# = -.3 : frontgrip# = -.3 : CAR1_cartype_b# = .5 : CAR1_cartype_c# = .5



yawspeed# = CAR1_cartype_wheelbase# * 0.5 * CAR1_car_angularvelocity#

If velocity_x# = 0
rot_angle# = 0
Else
rot_angle# = atanfull(yawspeed#,velocity_x#) * MULT2#
EndIf

If velocity_x# = 0
sideslip# = 0.0
Else
sideslip# = atanfull(velocity_y#,velocity_x#) * MULT2#
EndIf

slipanglefront# = sideslip# + rot_angle# - CAR1_car_steerangle#
slipanglerear# = sideslip# - rot_angle#

weight# = CAR1_cartype_mass# * 9.8 * 0.5

rem 4 wheel drive .
if whichdrive = 0
flatf_x# = 0
flatr_x# = 0
flatr_y# = reargrip# * slipanglerear# / ((CAR1_car_throttle# / 15000.0)+1):` was 5000
flatf_y# = frontgrip# * slipanglefront# / ((CAR1_car_throttle# / 15000.0)+1)
endif

rem front wheel drive .
if whichdrive = 1
flatr_y# = reargrip# * slipanglerear#
flatf_y# = frontgrip# * slipanglefront# / ((CAR1_car_throttle# / 15000.0)+1)
endif

rem rear wheel drive .
if whichdrive = 2
flatr_y# = reargrip# * slipanglerear# / ((CAR1_car_throttle# /15000.0)+1)
flatf_y# = frontgrip# * slipanglefront#
endif

rem add weight .
flatf_y# = flatf_y# * weight#
flatr_y# = flatr_y# * weight#


rem set flag for whether jeep is travelling forwards or backwards based on the sign of forward velocity .
if velocity_x# >= 0
sgn# = 1
else
sgn# = 0 - 1
endif


ftraction_x# = 100.0 * (CAR1_car_throttle# - CAR1_car_brake# * Sgn#)
ftraction_y# = 0.0

resistance_x# = (0-( RESISTANCE# * velocity_x# + DRAG# * velocity_x# * Abs( velocity_x# ) ))
resistance_y# = (0-( RESISTANCE# * velocity_y# + DRAG# * velocity_y# * Abs( velocity_y# ) ))

force_x# = ftraction_x# + (Sin( CAR1_car_steerangle# * MULT# )) * flatf_x# + flatr_x# + resistance_x#
force_y# = ftraction_y# + (Cos( CAR1_car_steerangle# * MULT# )) * flatf_y# + flatr_y# + resistance_y#

torque# = CAR1_cartype_b# * flatf_y# - CAR1_cartype_c# * flatr_y#

acceleration_x# = force_x# / CAR1_cartype_mass#
acceleration_y# = force_y# / CAR1_cartype_mass#


angular_acceleration# = torque# / CAR1_cartype_inertia#

acceleration_wc_x# = (cs# * acceleration_y#) + (sn# * acceleration_x#)
acceleration_wc_y# = ((0-sn#) * acceleration_y#) + (cs# * acceleration_x#)

CAR1_car_velocity_wc_x# = CAR1_car_velocity_wc_x# + (delta_t# * acceleration_wc_x#)
CAR1_car_velocity_wc_y# = CAR1_car_velocity_wc_y# + (delta_t# * acceleration_wc_y#)

CAR1_car_angularvelocity# = CAR1_car_angularvelocity# + (delta_t# * angular_acceleration#)


CAR1_car_position_wc_x# = CAR1_car_position_wc_x# + (delta_t# * CAR1_car_velocity_wc_x#)
CAR1_car_position_wc_y# = CAR1_car_position_wc_y# + (delta_t# * CAR1_car_velocity_wc_y#)

rem position jeep at new world coordinates .
position object (1),CAR1_car_position_wc_x#,object position y(1),CAR1_car_position_wc_y#

if velocity_x# > minspeed : rem stop car below minimum speed to stop car shuddering due to inconsistancies in the physics engine .
CAR1_car_angle# = CAR1_car_angle# + (delta_t# * CAR1_car_angularvelocity#)
if CAR1_car_angle# > (M_PI# * 2) then CAR1_car_angle# = CAR1_car_angle# - (M_PI# * 2)
if CAR1_car_angle# < (0 - M_PI# * 2) then CAR1_car_angle# = CAR1_car_angle# + (M_PI# * 2)
endif

rem turn jeep to new yaw angle .
`set object to object orientation 1,6
rotate object 1,0,0,0
turn object right 1,wrapvalue(CAR1_car_angle# * (180 / M_PI#))


rem update steering
turn#= joystick x()/160.0
CAR1_car_steerangle# = CAR1_car_steerangle# - ((0-M_PI#) / 180) * turn#
CAR1_car_steerangle# = CAR1_car_steerangle#*.8
` keyboard below
`If leftkeypressed = 1 and CAR1_car_steerangle# > 0 - .7 then CAR1_car_steerangle# = CAR1_car_steerangle# + ((0-M_PI#) / 180) * 4
`If rightkeypressed = 1 and CAR1_car_steerangle# < .7 then CAR1_car_steerangle# = CAR1_car_steerangle# + (M_PI# / 180) * 4

`if leftkeypressed = 0 and rightkeypressed = 0
`if CAR1_car_steerangle# < .1 and CAR1_car_steerangle# > 0 - .1 then CAR1_car_steerangle# = 0
`if CAR1_car_steerangle# > 0 then CAR1_car_steerangle# = CAR1_car_steerangle# - (M_PI# / 180) * 7
`if CAR1_car_steerangle# < 0 then CAR1_car_steerangle# = CAR1_car_steerangle# + (M_PI# / 180) * 7
`endif

rem check for throttle pressed .
If upkeypressed=1
CAR1_car_throttle# = CAR1_car_throttle# +80:` addition for acceleration of engine
if CAR1_car_throttle#> 1000.0 then CAR1_car_throttle# =1000
rem 2000 = throttle power . Increase for faster acceleration .
else
CAR1_car_throttle# = 0.0
endif

rem check for brake pressed .
If downkeypressed=1
CAR1_car_throttle# = 0.0
CAR1_car_brake# = 1000.0
if velocity_x# <= 0 then gosub stopall : rem reset physics engine if car stopped .
Else
CAR1_car_brake# = 0.0
EndIf


gosub alignjeep

rem new pitch angle for the wheels . rolling along forwards .
wheelpitchangle# = wrapvalue(wheelpitchangle# + (velocity_x# / 4))
doroll:
rem roll jeep body due to lateral forces on jeep . change rollscalefactor# for more or less roll .
rollamount# = force_y# / rollscalefactor#
roll object left 1,rollamount#

return



rem pitch and roll jeep to align on matrix .
alignjeep:

rem position car in world frame and rotate car body
h# = get ground height(1,object position x(1),object position z(1))
position object (1),object position x(1), h# ,object position z(1)

foot# = 2.5
ta#=wrapvalue((CAR1_car_angle# * (180 / M_PI#))-45)
frontleftx#=newxvalue(CAR1_car_position_wc_x#,ta#,foot#) : frontleftz#=newzvalue(CAR1_car_position_wc_y#,ta#,foot#)
ta#=wrapvalue((CAR1_car_angle# * (180 / M_PI#))+45)
frontrightx#=newxvalue(CAR1_car_position_wc_x#,ta#,foot#) : frontrightz#=newzvalue(CAR1_car_position_wc_y#,ta#,foot#)
ta#=wrapvalue((CAR1_car_angle# * (180 / M_PI#))+225)
backleftx#=newxvalue(CAR1_car_position_wc_x#,ta#,foot#) : backleftz#=newzvalue(CAR1_car_position_wc_y#,ta#,foot#)
ta#=wrapvalue((CAR1_car_angle# * (180 / M_PI#))+135)
backrightx#=newxvalue(CAR1_car_position_wc_x#,ta#,foot#) : backrightz#=newzvalue(CAR1_car_position_wc_y#,ta#,foot#)

frontlefth#=get ground height(1,frontleftx#,frontleftz#)
rem print frontlefth#
frontrighth#=get ground height(1,frontrightx#,frontrightz#)
rem print frontrighth#
backlefth#=get ground height(1,backleftx#,backleftz#)
rem print backlefth#
backrighth#=get ground height(1,backrightx#,backrightz#)
rem print backrighth#

across#=((frontrighth#-frontlefth#)+(backrighth#-backlefth#))/2.0
length#=((backlefth#-frontlefth#)+(backrighth#-frontrighth#))/2.0

rem Update car model
trackh#=(frontlefth#+frontrighth#+backlefth#+backrighth#)/4.0
if trackh#>h# then h#=trackh#
pitch object down 1, wrapvalue((length#/4.0) * (180 / M_PI#))
roll object left 1, wrapvalue((across#/4.0) * (180 / M_PI#))

rem raise jeep above ground
jeepheight# = 4.2
pitch object up 1,90
move object 1,jeepheight#
pitch object down 1,90

gosub positionwheels : rem place the wheels under the jeep

return



rem this routine effectively resets the physics engine by clearing all the physics variables .
rem only used if the jeep falls below minspeed where an engine reset is needed .
rem in my later versions of this algorithm, this is unesecary, but is left here as a debugging aid .
stopall:
CAR1_car_throttle# = 0
CAR1_car_brake# = 0
sgn# = 1
resistance_x# = 0
resistance_y# = 0
force_x# = 0
force_y# = 0
torque# = 0
acceleration_x# = 0
acceleration_y# = 0
velocity_x# = 0
velocity_y# = 0
angular_acceleration# = 0
acceleration_wc_x# = 0
acceleration_wc_y# = 0
CAR1_car_velocity_wc_x# = 0
CAR1_car_velocity_wc_y# = 0
CAR1_car_angularvelocity# = 0
flatf_x# = 0
flatr_x# = 0
flatr_y# = 0
flatf_y# = 0
yawspeed# = 0
rot_angle# = 0
sideslip# = 0
slipanglefront# = 0
slipanglerear# = 0
return



rem prints all physics variables . Useful for debuging but not actually used .
printall:
print "velocity_x# = ",velocity_x#
print "velocity_y# = ",velocity_y#
print "yawspeed# = ",yawspeed#
print "rot_angle# = ",rot_angle#
print "sideslip# = ",sideslip#
print "slipanglefront# = ",slipanglefront#
print "slipanglerear# = ",slipanglerear#
print "flatf_x# = ",flatf_x#
print "flatr_x# = ",flatr_x#
print "flatr_y# = ",flatr_y#
print "flatf_y# = ",flatf_y#
print "sgn# = ",sgn#
print "ftraction_x# =",ftraction_x#
print "ftraction_y# = ",ftraction_y#
print "rear_slip =",rear_slip
print "resistance_x# = ",resistance_x#
print "resistance_y# = ",resistance_y#
print "force_x# = ",force_x#
print "force_y# = ",force_y#
print "torque# = ",torque#
print "acceleration_x# = ",acceleration_x#
print "acceleration_y# = ",acceleration_y#
print "angular_acceleration# = ",angular_acceleration#
print "acceleration_wc_x# = ",acceleration_wc_x#
print "acceleration_wc_y# = ",acceleration_wc_y#
print "CAR1_car_velocity_wc_x# = ",CAR1_car_velocity_wc_x#
print "CAR1_car_velocity_wc_y# = ",CAR1_car_velocity_wc_y#
print "CAR1_car_position_wc_x# = ",CAR1_car_position_wc_x#
print "CAR1_car_position_wc_y# = ",CAR1_car_position_wc_y#
print "CAR1_car_angularvelocity# = ",CAR1_car_angularvelocity#
print "CAR1_car_angle# = ",CAR1_car_angle#
print "CAR1_car_throttle# = ",CAR1_car_throttle#
print "CAR1_car_brake# = ",CAR1_car_brake#
return




rem camera tracking routine
updatecamera:
if camflag = 1

cdestx#=object position x(1)
cdesty#=object position y(1)+5 : rem +5 units above the jeep. Track slightly above the jeep .
cdestz#=object position z(1)

ccurrentx#=camera position x()
ccurrenty#=camera position y()
ccurrentz#=camera position z()

ccurrentx#=curvevalue(cdestx#,ccurrentx#,cameraspeed)
ccurrenty#=curvevalue(cdesty#,ccurrenty#,cameraspeed)
ccurrentz#=curvevalue(cdestz#,ccurrentz#,cameraspeed)

` position camera ccurrentx#,ccurrenty#,ccurrentz#
`old view uses point below As well
` position camera object position x(1),object position y(1)+2,object position z(1)
` set camera to object orientation 1
` turn camera right 180
` move camera 5

position camera object position x(1),object position y(1)+2,object position z(1)
set camera to object orientation 1
turn camera right 180
move camera 5
point camera object position x(1),object position y(1)+2,object position z(1)
move camera 5

else
point camera object position x(1),object position y(1),object position z(1)
endif

return


` ================================= makeimage ============
makeimageg:
cls rgb(30,80,10)

ink rgb(60,100,30),0
for x=0 to 56
dot x,rnd(56):dot x,rnd(56):dot x,rnd(56):dot x,rnd(56)
dot x,rnd(56):dot x,rnd(56):dot x,rnd(56):dot x,rnd(56)
next x

ink rgb(40,110,40),0
for x=0 to 56
dot x,rnd(56):dot x,rnd(56):dot x,rnd(56):dot x,rnd(56)
dot x,rnd(56):dot x,rnd(56):dot x,rnd(56):dot x,rnd(56)
next x

ink rgb(10,65,20),0
for x=0 to 56
dot x,rnd(56):dot x,rnd(56):dot x,rnd(56):dot x,rnd(56)
dot x,rnd(56):dot x,rnd(56):dot x,rnd(56):dot x,rnd(56)
next x

get image 1,0,0,56,56
return
` =====================================================================make second image
makeimager:
cls rgb(150,150,150)

ink rgb(110,110,110),0
for x=0 to 128
dot x,rnd(128):dot x,rnd(128):dot x,rnd(128):dot x,rnd(128)
dot x,rnd(128):dot x,rnd(128):dot x,rnd(128):dot x,rnd(128)
next x

ink rgb(130,130,130),0
for x=0 to 128
dot x,rnd(128):dot x,rnd(128):dot x,rnd(128):dot x,rnd(128)
dot x,rnd(128):dot x,rnd(128):dot x,rnd(128):dot x,rnd(128)
next x

ink rgb(170,175,170),0
for x=0 to 128
dot x,rnd(128):dot x,rnd(128):dot x,rnd(128):dot x,rnd(128)
dot x,rnd(128):dot x,rnd(128):dot x,rnd(128):dot x,rnd(128)
next x

get image 2,0,0,128,128

return

` ============================================================= make track ===========
`.......................make a track!!
maketrack:
d=0
for x=30 to 34
make object plain x,150,300
texture object x,2
pitch object down x,90
position object x, 2000,.5,2100+(300*d)
inc d
next x

d=0
for x=35 to 42
make object plain x,100,300
texture object x,2
pitch object down x,90
position object x, 2300,.5,2100+(300*d)
inc d
next x
` --------------------
make object plain 44,200,200
texture object 44,2
pitch object down 44,90
position object 44, 2150,.5,2100

make object plain 45,200,300
texture object 45,2
pitch object down 45,90
position object 45, 2150,.5,3400
` -----------------------------
make object plain 46,100,400
texture object 46,2
pitch object down 46,90
position object 46, 2450,.5,3700
` two together
make object plain 47,100,400
texture object 47,2
pitch object down 47,90
position object 47, 2450,.5,4100

make object plain 48,100,150
texture object 48,2
pitch object down 48,90
position object 48, 2350,.5,4300

make object plain 49,150,150
texture object 49,2
pitch object down 49,90
position object 49, 2350,.5,3550

return
`================= end track[/code]


Vamos, que con este codigo lo teneis todo mascadito. Lo unico es transladarlo a lo que vosotros querais.

Si eso con que os fijeis un poco en los comentarios -Donde pone al principio de la linea "REM" o "`" - y con un poco de logica creo que se puede sacar...


Espero que os sirva.

Y no lo he puesto en link porque hace falta registrarse en la pagina donde lo he sacado, pese a ser publico...

  • The_Hans

  • TERRESTRIS VERITAS

  • vida restante: 100%
  • Registrado: 27 ene 2004
  • Mensajes: 7.490
#5

Escrito 03 marzo 2009 - 20:45

Yo te recomendaría un sistema de nodos en el cual el padre tenga como hijos al chasis por un lado y a las ruedas por otro, así te evitarías tener que pensar en el movimiento de cada uno en función de la posición de los demás pero claro, para eso necesita un árbol de nodos, y eso no es tan trivial.

  • Ellolo17

  • Máscara de Majora

  • vida restante: 100%
  • Registrado: 16 nov 2006
  • Mensajes: 6.208
#6

Escrito 03 marzo 2009 - 20:53

Bueno, dices el blender, no?

Ahi te puedes crear un objeto 3d con forma de coche, y cuatro objetos "tontos" -simplemente en el modo objeto le das a crear nuevo, te pones a editarle y le quitas todos los vertices y al volver a objeto ves que sigue existiendo el objeto, pero no hay nada-. Colocas uno de esos en cada punto donde iria una rueda y luego programando...

No se como es en vuestro motor pero en el mio esos objetos "tontos" se llaman "limbs" -extremidades- y se puede llamar a sus coordenadas, crear nuevos limbs en un mesh ya existente basandose en primitivas o en objetos 3d ya creados...



La verdad, es asi como se hace en los juegos de rol y los fps para las armas, y en los de rol para las distintas armaduras, todo usando un mismo personaje. Crean un limb en la "mano" del personaje y asi saben donde deben colocar el objeto del arma que lleve en ese momento. Pero que yo sepa en mi motor al menos segun el comando que uses tiene en cuenta la rotacion y con el otro que hace lo mismo tienes que controlar la rotacion tu.

Un saludo.

  • Ollydbg

  • Charger

  • vida restante: 100%
  • Registrado: 05 sep 2008
  • Mensajes: 6.259
#7

Escrito 03 marzo 2009 - 21:24

Para que me quede claro.
Según el primer método expuesto por Ellolo17 en realidad tengo "dos" modelos. El modelo A) es el de la carrocería (sin ruedas, o bien sin las ruedas delanteras) y el modelo B) es otro modelo que consta de las dos ruedas delanteras. En función de la variable "giro", he de pintar el modelo B) en una posición u otra, pero siempre teniendo como referencia no la matriz de proyección sino la proyección del modelo A) (la carrocería).

Pienso que esto un "marear la perdiz". Como comenta The_Hans (y ahora que me fijo también Ellolo17 en su segundo post) creo (o pienso que debería existir) algo en Blender que me permitiese decir que las "Ruedas delanteras" pertenecen "a la carrocería". Si yo muevo la "carroceria", tambien se mueven las ruedas, pero, me permite mover "las ruedas" en otro eje (el Z en mi caso). De esta forma no me tengo que preocupar de la posición relativa de las ruedas con respecto a la carrocería, ya que éstas se mueven siempre que se mueva la carrocería.

No sé si me explico.

¿arbol de nodos, cómo?, ¿"limbs" en Blender?. Ahora g**gleo un poco sobre el tema.

gothmog_es. En gamedev encontré en su día un articulo sobre el movimiento de un coche desde una perspectiva zenital (inercias, derrapes, radio de curvatura, etc). No sé exactamente si te refieres a eso. Si es así coméntamelo e intentaré buscar el enlace.

Saludos.

  • Ollydbg

  • Charger

  • vida restante: 100%
  • Registrado: 05 sep 2008
  • Mensajes: 6.259
#8

Escrito 04 marzo 2009 - 00:19

Después de g**glear un poco he encontrado esto, que es exáctamente lo que estaba intentado hacer (y ya es casualidad que ahí tambien hace el ejemplo con "las ruedas" de un coche, jejeje)

Voy a hecharle un vistazo haber que saco en claro. De nuevo gracias por las orientaciones.

Saludos.

#9

Escrito 04 marzo 2009 - 02:04

gothmog_es. En gamedev encontré en su día un articulo sobre el movimiento de un coche desde una perspectiva zenital (inercias, derrapes, radio de curvatura, etc). No sé exactamente si te refieres a eso. Si es así coméntamelo e intentaré buscar el enlace.

Saludos.


Es este?

http://www.gamedev.n...ures/2dcarphys/

La verdad es que está genial, pero mucha física veo yo ahí, uff :D

De todas formas, me refería más bien al tema 3d, meshes y demás. No obstante lo dejaré en favoritos, aunque no sé si llegaré a ese nivel alguna vez.

  • Ellolo17

  • Máscara de Majora

  • vida restante: 100%
  • Registrado: 16 nov 2006
  • Mensajes: 6.208
#10

Escrito 05 marzo 2009 - 18:00

Am, leches, esque te referias a animarlo por huesos. Creia que te referias a hacer lo que me dices por codigo en el juego -me parece mas simple eso que animar el giro a la izquierda, el giro a la derecha y luego que segun si se pulsa izquieda vaya recorriendo fotogramas hasta que este en posicion y si se pulsa la otra tecla recorra la animacion al reves...-

Si has podido ver hows to o diarios de desarrollo o editores de cosas asi para juegos, como el editor de mapas del C&C Renegade, ves que lo que hacen es tener todas las meshes por separado, unirlas para formar los vehiculos a base de codigo en el juego y luego controlar las cosas por separado.

Asi se puede tener un vehiculo en el que vaya por un lado la carroceria, por otro la torreta, por otro la antena a lo suyo...


Si el juego es de estrategia no necesita todo eso y con lo que tu pides va sobrado ;)

Como supongo que el juego es de carreras -por eso los tres modelos por separado- pues por eso todo eso.

Por cierto: ¿Que tal lo llevas?


PDD: Bajate la version de prueba del motor ShiVa, de Stonetrip. Ahi tienen hecho un juego de simulacion de vehiculos en el que puedes ver como esta hecho. Ahi tambien es por un lado el modelo de una unica rueda copiado cuatro veces, el modelo de la carroceria, el modelo de los cristales y todo eso unido y controlado mediante programacion. ;)
http://www.stonetrip.../shiva-ple.html

Ahi tienes el link. Es la edicion de aprendizaje personal. No puede exportar los juegos que se hagan ahi pero te sirve de sobra para ver como es ese juego que incluye ;)

  • Ellolo17

  • Máscara de Majora

  • vida restante: 100%
  • Registrado: 16 nov 2006
  • Mensajes: 6.208
#11

Escrito 05 marzo 2009 - 18:26

Para mas info te paso un link al documento para vehiculos del source de valve donde encontrarás consejos utiles sobre esto:

http://developer.val...icles_(modeling)

Ahi tambien te dice: Ruedas por separado.
Controlar colisiones del chasis y de cada rueda por separado
Hacer tres animaciones:
1_arranque derrapando
2_Estando quieto
3_Al subir una marcha.

Tambien hay informacion de las variables que usan ellos para manejarlo.

Am, y una vista a la entidad vehiculo para ver sus funciones y variables:
http://developer.val...ki/Prop_vehicle

  • Ollydbg

  • Charger

  • vida restante: 100%
  • Registrado: 05 sep 2008
  • Mensajes: 6.259
#12

Escrito 06 marzo 2009 - 01:51

Ante todo de nuevo gracias Ellolo17 por tomarte la molestia de buscar info sobre el tema.
La cuestión no es problema del código (estoy casi seguro al 99.9%)
Manejar "bones" en XNA es tremendamente fácil por lo que he podido comprobar. De hecho encontré el siguiente ejemplo:
http://creators.xna....simpleanimation
Ahí se ve el modelo de un "tanque" (un archivo tambien *.fbx) donde giran las cuatro ruedas, la torreta y la escotilla, todos de forma independiente.

Mirando el código fuente ves que no tiene ningún misterio. Cargas los bones en objetos de tipo ModelBone, guardas la transformación original de cada bone en una matriz, y a la hora de "pintar" el objeto, realizas las transformaciones (rotación en el eje que quieras) del bone que quieras y pintas el objeto. Como ves no tiene ningún misterio. Son apenas 10 líneas de código.

El problema que tengo es mi falta total de manejo con Blender. Grrrrr..

Se supone que tengo esto:
http://img3.imagesha...stbones0xna.jpg

El nodo llamado Bone es el nodo "padre". El nodo llamado Bone.001 es el nodo hijo.
A cada nodo le he asociado una caja.

Si muevo el nodo "hijo" (Bone.001) veo como se mueve la caja que está asociada a él:
http://img13.imagesh...stbones1xna.jpg

Si muevo el nodo "padre" (Bone) veo como se mueve la caja que está asociada a él y además tambien se mueve el nodo "hijo" (y como consecuencia la caja que está asociada al nodo "hijo"):
http://img3.imagesha...stbones2xna.jpg

Vale, digo..de coña. "Parece" que funciona. Craso error. Lo exporto a fbx, lo meto en el código que utiliza el tanque del primer enlace que he puesto (por eso digo que descarto que sea problema de código) y lo único que veo son las dos cajas, pero la caja "hija" no rota de forma "independiente". (y sí, he probado con los dos nodos).

¿Hay algún tutorial para torpes (pero para torpes, torpes, torpes :D ) sobre Blender?

PD:Ellolo17, ¿hay alguna posibilidad de pillar tu MSN por algún sitio? :D

PD2: ops, gothmog_es efectivamente, ese es el tutorial que decía ;)

Saludos.

  • Ellolo17

  • Máscara de Majora

  • vida restante: 100%
  • Registrado: 16 nov 2006
  • Mensajes: 6.208
#13

Escrito 06 marzo 2009 - 10:52

Un pequeño apunte sobre el video de ahi que has pasado... de lo que habla es de como importar modelos de una forma distinta pero no pone nada de los huesos ni nada de eso :( -Es que, si alguien conoce algun motor que te permita importar los huesos directamente desde el blender o el programa que sea, que me avise porque si no me he puesto a añadir ragdolls a mis programas es porque tendria que crear los huesos a base de codigo y manejarlos desde ahi...-

En serio. Ni el Newton, ni el Havok ni ningun motor de fisicas que yo conozca permite eso.

Lo lamento pero el blender no me deja importar el formato del modelo para echarle un vistazo, pero te comento: Por lo que he lido sobre el programa y todo eso lo que hace es cargar el modelo de una forma distinta a como lo carga el XNA de forma estandar y con ese modelo programan que las diferentes partes vayan cada una por su lado

-lo de los limbs que te comentaba antes. En un modelo puedes tener varias mallas. Una para el chasis, una para cada rueda, una para cada luna del coche, una para el tubo de escape... Todo eso en un mismo modelo. Y lo normal en un motor grafico es que te permita retocarlos aparte-


Para ayudarte a entender un poco lo que te voy a explicar te pongo los comandos de los limbs que hay en mi motor:[code:1]

*PERFORM CHECKLIST FOR OBJECT LIMBS : PERFORM CHECKLIST FOR OBJECT LIMBS Object Number
*OFFSET LIMB : OFFSET LIMB Object Number, Limb Number, X, Y, Z
*SCALE LIMB : SCALE LIMB Object Number, Limb Number, XSize, YSize, ZSize
*ROTATE LIMB : ROTATE LIMB Object Number, Limb Number, XAngle, YAngle, ZAngle
*SHOW LIMB : SHOW LIMB Object Number, Limb Number
*HIDE LIMB : HIDE LIMB Object Number, Limb Number
*TEXTURE LIMB : TEXTURE LIMB Object Number, Limb Number, Image Number
*COLOR LIMB : COLOR LIMB Object Number, Limb Number, Color Value
*SCALE LIMB TEXTURE : SCALE LIMB TEXTURE Object Number, Limb Number, UScale, VScale
*SCROLL LIMB TEXTURE : SCROLL LIMB TEXTURE Object Number, Limb Number, X, Y
*ADD LIMB : ADD LIMB Object Number, Limb Number, Mesh Number
*LINK LIMB : LINK LIMB Object Number, Limb Parent, Limb Child
*REMOVE LIMB : REMOVE LIMB Object Number, Limb Number
*SET LIMB SMOOTHING : SET LIMB SMOOTHING Object Number, Limb Number, Percentage
*SET LIMB NORMALS : SET LIMB NORMALS Object Number, Limb Number
*EXCLUDE LIMB ON : EXCLUDE LIMB ON Object ID, Limb Number
*EXCLUDE LIMB OFF : EXCLUDE LIMB OFF Object ID, Limb Number[/code]

Fijate que se refiere a distintas partes de un modelo 3d en vez de referirse al modelo completo.

Yo puedo hacer un solo objeto 3d con varias partes, o mallas, o lo que sea. Siendo una de ellas el chasis y las ruedas.

Luego durante el codigo -asi a lo rapido y sin pensar-:

Si se pulsa la tecla hacia arriba
variable de angulo X = variable de angulo x + 1
si se pulsa la tecla hacia abajo
Variable de angulo x = variable de angulo x - 1
si se pulsa la tecla izquierda
variable de angulo y = variable de angulo y - 1
si se pulsa la tecla derecha
variable de angulo y = variable de angulo y + 1

ROTATE LIMB numero de identificacion del objeto, numero de identificacion de la rueda dentro del objeto, variable angulo x, variable angulo y, variable angulo z

Y con eso se puede controlar todo esto. Y apuesto a que es como lo han hecho en esa demo


----------------------------------------------------------

Sobre los huesos:

Yo suelo poner siempre el hueso padre -el primero de todos- apartado del objeto 3d y controlando todos sus vertices para ayudar a que no se aleje del punto de coordenadas 0,0,0.

Luego ya voy añadiendo los huesos que hacen falta.

Ahora viene lo chulo: El skinning. Pintar los vertices que son afectados por cada hueso y en cada objeto afectado por la armadura.

Basicamente, tu al objeto de añades el modificador armature, le pones el nombre que tenga la armadura -normalmente, armature- y te aseguras que el boton "vertex group" este activado.

En el modo objetos seleccionas la armadura, te vas al modo "pose", seleccionas el modelo 3d que va a ser afectado por la armadura con el boton derecho del raton, le das a pintar peso -weight paint-. Con el boton derecho del raton seleccionas el hueso que quieras y con el izquierdo vas pintando de rojo los vertices que son afectados por ese hueso.

Automaticamente te pone en el vertexgroup el nombre del hueso y con todo eso luego te vas al modo objeto del objeto 3d, eliges la armadura, sales del modo pose y estando todo en modo objeto -esta parte puede ser un poco liosa, mas o menos es que vuelvas al estado normal de todo. Y lo hago para asegurarme de que se le han quedado los datos bien y que no toco nada, porque no se tarda nada en hacer y una vez me confundi y jodi todo un modelo trasteando-.

En fin, que ya en el modo objeto seleccionas los modelos, aplicas el modificador armadura y entonces si, eliges la armadura, le das a pose y a base de rotar los huesos o moverlos tienes que poder animarlo ya.



¿Como aplicarlo a lo tuyo? Creas el hueso padre entre las dos ruedas. En el centro mas o menos justo entre ellas. Luego al hueso padre le creas dos hijos. Uno va a una rueda y el otro a la otra.

Asi evitas que se te doble de esa forma tan fea como nos muestras en las imagenes ;)



-------------------------------------------------------

Mmm... acabo de leer lo de los modelbones y parece que el XNA si puede macer modificaciones en los huesos a base de codigo... Bueno, pues a por ello a ver ;) -Tambien he visto que lo que yo conozco como limbs o partes son en el XNA llamados "Nodos"


En fin, espero con esto al menos haber ayudado con lo de blender ^^u

Un saludo.



EDIT:::::::::::::::::.
Vaya, acabo de ver que en una de las ultimas actualizaciones de mi motor este tambien lo hace lo de animar huesos a base de codigo... son tratados como "limbs" tambien, eso me facilita mucho las cosas! :)

-lo unico aclararse del ID de cada limb que a no ser que me cree un pequeño programa que me muestre eso...-


Imagen Enviada

EDIT 2::::::::::::::::::::::....

Am, y sobre el messenger... creeme si te digo que es mas facil contactar conmigo por mp, En el messenger suelo estar todo el rato sin conexion y solo por si se me necesita para algo, pero vamos. Normalmente como si no estuviera ;)

  • Ollydbg

  • Charger

  • vida restante: 100%
  • Registrado: 05 sep 2008
  • Mensajes: 6.259
#14

Escrito 07 marzo 2009 - 01:23

Vale, creo que nos estabamos refiriendo a dos cosas distintas.

Después de leer tu mini-howto he descubierto que yo no quiero hacer lo del "weight paint". (por lo menos no de momento).
Trasteando un poco con Blender (y porque no decirlo, mirando también aquí
he visto que puedes "deformar" el modelo según el movimiento de los bones.
Eso a mi aún me queda "grande" :D (aunque sigo pensando que con XNA es posible que puedas hacerlo, pero como comento, de momento no necesito hacer "eso").

Como bien apuntas en la primera parte de tu post, yo quiero hacer algo mucho más simple. Mover (que no deformar) distintos modelos, dando así la sensación de que el modelo está "animado".

Te dejo esta bírria que he pintado con Blender:

http://www.megaupload.com/?d=0CJIINML
(no he encotrado otro sitio donde "subirlo", sorry)

Si te lo bajas y lo abres con Blender (yo uso la 248.1) verás que dispone de dos Meshes: Una "Caja" y una "Torreta".
La intención es que si mueves el armature que está en"Parent"ado con la caja se mueve la caja y la torreta. Pero si solo mueves el armature que está en"Parent"ado con la torreta sólo se mueve la torreta.
A priori esto parece correcto, pero chico, exporto todo a *.fbx y allí no se mueve nada o bien estoy interpretando de forma incorrecta algo que se me escapa :(

I need some help please!!!

Saludos y gracias de nuevo por la paciencia.


--- Editado ---

Pues después de mucho mirar páginas y tutoriales me he dado cuenta que lo estaba haciendo "mal" (para variar) X-D

Ete aquí mi resultado final:

Imagen Enviada

Ya puedo "girar" las ruedas, "acelerarlas", etc, en definitiva, hacer todas las perrerías que quiera.

El tema está en que los bones (armatures y demás) se utilizan en XNA para crear "animaciones". Tal y como se muestra un ejemplo aqui. (Ahí se muestra un gabacho caminando).

Yo no quería hacer "animaciones" (de momento). Quería hacer algo mucho más simple. Y de hecho es simple de narices una vez que entiendes como hacerlo.
La escena de mi coche tiene 5 modelos: "Chasis", "Rueda delantera Derecha", "Rueda delantera Izquierda", "Rueda trasera Derecha", "Rueda trasera Izquierda".
No tiene ni "Armatures", ni "Bones" ni nada, solo esos 5 modelos.

Lo que me desconcertó al principio fue esto:
[code:1]ModelBone RuedaDelantera_Derecha;
ModelBone RuedaDelantera_Izquierda;
ModelBone RuedaTrasera_Derecha;
ModelBone RuedaTrsera_Izquierda;
[/code]

Claro, yo veo eso en el código y pienso que son "Bones"

Y luego cuando veo esto:
[code:1]RuedaDelantera_Derecha = modeloCoche.Bones["Rueda_DD"];
RuedaDelantera_Izquierda = modeloCoche.Bones["Rueda_DI"];
RuedaTrasera_Derecha = modeloCoche.Bones["Rueda_TD"];
RuedaTrsera_Izquierda = modeloCoche.Bones["Rueda_TI"];
[/code]
También pienso que eso de alguna forma son "los nombres de los bones que asocian los distintos modelos"
Y es precisamente aquí donde estaba el error. Eso NO SON bones. Son los nombres de los modelos. >:-\ >:-\ >:-\ >:-\ >:-\

En definitiva, que me he tirao casi una semana para entender eso. Si alguien necesita tanto el código como el modelo en blender que no se corte y me lo pida.

Saludos.


Este tema ha sido archivado. Esto significa que no puedes responder en este tema.
publicidad