|
|
|
Navegacion y colision 3d - 3d Collision Navigation
Added on 9/13/2004
|
|
Compatibilities:
|
This item has not yet been rated
|
Con la referencia de Paul Catanese desarrollé este control de navegacion y colisiones.
Es bastante secillo, y cualquier duda pueden contactarme a la direccion de mail.
------------------------------------------
With the reference of Paul Catanese I developed to east control of navigation and collisions. Secillo is enough, and any doubt can contact me to the mail direction.
--------------------------------------------------------
-- CONTROL DE NAVEGACION Y COLISIONES --
-- Escrito por Fernando Miró - Julio 2004 --
-- Con la colaboración de Paul Catanese --
-- Libre de copyright --
--------------------------------------------------------
property p3dMember -- referencia al 3D member
property pSprite -- referencia al 3D sprite
property pCamera -- referencia al sprite de camara
property pCameraSphere -- referencia a la sphere usada en la camara (para la colision)
property pMouseDown -- propiedad de boton izquierdo
property pRMouseDown -- propiedad de boton derecho
property pEnter -- propiedad de cursor enter
on beginSprite me
-- inicia los "properties"
p3dMember = sprite(me.spriteNum).member
pSprite = sprite(me.spriteNum)
pCamera = pSprite.camera
-- crea la esfera de colision de camara
camSphereRes = p3dMember.newModelResource("camSphereRes",#sphere)
camSphereRes.radius = 20
pCameraSphere = p3dMember.newModel("cameraSphere",camSphereRes)
-- hace a la esfera un "child" de camara, usando #preserveParent
-- para que se mueva con la camara (el parent)
pCamera.addChild(pCameraSphere,#preserveParent)
-- hace el registro del member para regular el evento "timeMS", responder
-- a los datos de teclado y resuelve la colision de camara
p3dMember.registerForEvent(#timeMS,#controlCamera,me,1000,10,0)
on controlCamera me
--------------------------------------------------------------------
-- CONTROL DE NAVEGACION --
--------------------------------------------------------------------
-- si el cursor esta en la parte superior del modelo,
--la camara mueve hacia adelante
if the mousev > 141 then
pCamera.translate (0,0,2)
end if
-- si el cursor esta en la parte inferior del modelo,
--la camara mueve hacia atras
if the mousev < 257 then
pCamera.translate (0,0,-2)
end if
-- si el el cursor esta sobre la derecha del modelo,
-- la camara gira hacia derecha
if the mouseh > 145 then
pCamera.rotate (0,-0.3,0)
end if
-- si el el cursor esta sobre la izquierda del modelo,
-- la camara gira hacia izquierda
if the mouseh < 349 then
pCamera.rotate (0,0.3,0)
end if
-----------------------------------------------------------------------
-- CONTROL DE COLISION DE CAMARA --
-----------------------------------------------------------------------
-- emite un RAY hacia la izquierda
collisionList = p3dMember.modelsUnderRay(pCamera.worldPosition,
-pCamera.transform.xAxis,#detailed)
-- si hay modelos frente a la camara, chequea la colision
if (collisionList.count) then
me.checkForCollision(collisionList[1])
end if
-- emite un RAY hacia la derecha
collisionList = p3dMember.modelsUnderRay(pCamera.worldPosition,
pCamera.transform.xAxis,#detailed)
-- si hay modelos frente a la camara, chequea la colision
if (collisionList.count) then
me.checkForCollision(collisionList[1])
end if
-- emite un RAY hacia adelante
collisionList = p3dMember.modelsUnderRay(pCamera.worldPosition,
-pCamera.transform.zAxis,#detailed)
-- si hay modelos frente a la camara, chequea la colision
if (collisionList.count) then
me.checkForCollision(collisionList[1])
end if
-- emite un RAY hacia atras
collisionList = p3dMember.modelsUnderRay(pCamera.worldPosition,
pCamera.transform.zAxis,#detailed)
-- si hay modelos frente a la camara, chequea la colision
if (collisionList.count) then
me.checkForCollision(collisionList[1])
end if
end
on checkForCollision me, thisData
-- evalua la distancia para el collisionList
dist = thisData.distance
-- comprueba si la distancia es menor que el radio de la esfera de camara
if (dist < pCameraSphere.resource.radius) then
-- calcula la distancia de penetracion
diff = pCameraSphere.resource.radius - dist
-- calcula el vector perpendicular a la superficie de lapared
-- para mover la camara (usando la propiedad #isectNormal)
tVector = thisData.isectNormal * diff
-- mueve la camara para resolver la colision
pCamera.translate(tVector,#world)
end if
end
|
|