Entrar
¿Nuevo usuario? Inscribirme
smalltalking · Un lugar para el estudio y desarrollo de Ambientes de Objetos virtuales.
? ¿Ya estás suscrito? Entra a Yahoo!

Consejos

¿Sabías que...?
Podés cambiar el orden de los mensajes. Simplemente hacé clic en el enlace de columna fecha. Tus preferencias se guardarán, por lo tanto no necesitarás hacerlo otra vez cuando vuelvas a entrar.

Mensajes

  Mensajes Ayuda
Avanzado
Re: [objetos] OFFTOPIC: Interpolacion de la Cámara   Lista de mensajes  
Responder | Reenviar Mensaje #15891 de 17205 |
Re: [objetos] OFFTOPIC: Interpolacion de la Cámara

Hola Ale
 
You wrote:
Los "saltos", los observaste en la implementación de la pecera con Genesis3D ?
 
Hay no es tan notorio pues la velocidad de los objetos no es tan grande.
 
You wrote:
Con ese mismo modelo e implementación, estas buscando que no se observe?
O lo estas buscando sobre otra implementación? (y/o sobre otro modelo 3D)
 
Ese mismo modelo lo porte a MT para no invertir mucho tiempo en ese punto y me di cuenta del problema de inmediato.
 
 
Como parte de mi aprendizaje sobre newton + genesis3D, estoy utilizando un modelo de vehiculo que provee NGD, es decir este provee lo que se llama un VehicleJoint.
Es te VehicleJoint es solo una interfase que simula el comportamiento de un vehiculo.
 
Como dijo julio jerez autor de NGD, el  VehicleJoint no es una lámpara  mágica  que se frote y tengo un vehiculo, pero si proporciona la parte mas difícil de hacer.
 
Ahora volviendo a la cámara, esta es la respuesta concreta en el foro de Vjuegos:
 
El problema se debe a que como vas calculando la posición de la cámara a cada ciclo con respecto a tu objeto, cualquier movimiento minimo influirá aun cuando sea algo muy rápido, no se en donde tienes la cámara en relación con tu objeto, pero por ejemplo si estuvieras orbitándola a cierta distancia de tu auto, cualquier mínima variación en el ángulo de este se traduciría en varias unidades de medida para la cámara.

Si el problema fuera este, lo mejor que se puede hacer es no mover la cámara inmediatamente, sino calcular cual sería ese punto final donde quieres que se coloque y mover la cámara con interpolación y aceleración no lineal, asi la cámara tendría un retrazo al moverse y tendrías un movimiento suave en todo momento.
 
Que por lo que entiendo es algo similar a lo que vos decís, sobre el resorte entre la cámara y el vehiculo.
 
El punto es que no entiendo  en que parte de la implementación de OgreNewton que pegué esta la famosa interpolación y aceleración no lineal.
 
Debo decir que estoy un poco oxidado sobre los temas de calculo
 
Saludos kiko


"Alejandro F. Reimondo" <aleReimondo@...> escribió:
kiko,
Los "saltos", los observaste en la implementación de la pecera con Genesis3D ?
Con ese mismo modelo e implementación, estas buscando que no se observe?
O lo estas buscando sobre otra implementación? (y/o sobre otro modelo 3D)
 
Segun entiendo, si el objeto a seguir se mueve a saltos (en lineas rectas
 y/o doblando bruscamente) esto se traducirá a la cámara que toma
 su posición del objeto a seguir.
Si los objetos se te mueven bruscamente quizás deberás relajar la
 aceleración de la cámara, es decir, pegar un resorte entre
 la cámara y el objeto, para suavizar sus movimientos.
Así trataría de resolverlo yo, de todas formas, creo oportuno decirte que
 sería recomendable revisar el modelo de los objetos que se están
 moviendo para ver si tu modelo los mueve muy bruscamente y si es
 factible modificar el modelo en caso de ser así.
 
suerte!
Ale.
 
----- Original Message -----
Sent: Thursday, June 07, 2007 4:29 PM
Subject: [objetos] OFFTOPIC: Interpolacion de la Cámara

Hola Gente
 
Disculpen que pregunte por este tema que no esta relacionado directamente con ST, el punto es que no puedo entender donde esta el secreto para tener una cámara que siga a mi vehiculo de manera correcta.
Yo implemente la solución como la tiene Ale en Genesis3D, de primer momento encontré que el movimiento no era fluido, es decir la cámara va dando pequeños saltos según aumenta la velocidad.
En aquel momento no quise invertir tiempo en este punto y lo deje como estaba.
Ahora quiero mejorar esto y no encuentro la manera de hacerlo.
Preguntando en el foro Vjuegos.org me comentaron que tenía que hacer interpolación para obtener un movimiento fluido.
Me puse a investigar de qué se trata la interpolación de la que hablaban, pero no encontré gran cosa.
Por lo que entiendo interpolar es encontrar un punto en un intervalo a partir de sus extremos, en mi caso la posición de la cámara y el vehiculo.
Luego encontré como lo hacen en la demo de NewtonOgre, pero sigo sin entender donde esta el secreto.
Se supone que el secreto esta en como calculo el punto a moverme, ya que se supone que eso es lo que provoca los pequeños saltos.
Este es la forma de ALE:
 
 
GenesisBoids>>followSelected
" Private - Follow the selected object. "
| point xForm distance |
self selected isNil ifTrue: [ ^self ].
distance := self scale / 5 * self selected body boundingBox diagonal length negated.
xForm := self selected body xForm.
point := xForm position
add: xForm in
scaledBy: distance.
point y: 107 * self scale // 5 + point y. "overhead offset"
self navigator xForm:
(point xFormPointingTo: xForm position)
GenesisVector3D>>xFormPointingTo: target
" Returns a transform placed at the receiver for looking to target. "
^self xFormPointingTo: target at: self
GenesisVector3D>>xFormPointingTo: target at: location
" Returns a transform placed at location looking from the receiver to target. "
| vertical result vector temp |
vertical := self species from: #(0 1 0). "Create straight up vector."
"Create the source vector, fudging it if its coplanar to the comparison vector."
vector := self - target.
(vertical x = vector x and: [ vertical z = vector z ])
ifTrue: [ vertical x: vertical x + 1 ].
"Set the IN vector."
result := GenesisXForm identity.
vector normalize.
result az: vector x; bz: vector y; cz: vector z; yourself.
"Use it with the IN vector to get the RIGHT vector."
temp := vertical crossProduct: vector.
temp normalize.
"Put the RIGHT vector in the matrix."
result ax: temp x; bx: temp y; cx: temp z; yourself.
"Use the RIGHT vector with the IN vector to get the real UP vector."
vertical := vector crossProduct: temp.
vertical normalize.
"Put the UP vector in the matrix."
result ay: vertical x; by: vertical y; cy: vertical z; yourself.
"Put the translation in."
result translation: location.
^result
 
Esta es la implementación de NewtonOgre:
 
void
FollowCamera::update( Ogre::Real deltat )
{
// first, get the ideal goal position.
Ogre::Vector3 mypos;
Ogre::Vector3 goalpos;
Ogre::Vector3 togoal;
// if no goal node is assigned, we can`t move.
if (!mGoalNode)
return;
mypos = mCamera->getPosition();
goalpos = mGoalNode->getWorldPosition();
//first get the Y offset and the XZ plane offset from the pitch angle.
Ogre::Real x, y, z, xz;
y = sin( mPitch.valueRadians() ) * mDist;
xz = cos( mPitch.valueRadians() ) * mDist;
// now get the x any z values from the Yaw angle.
x = sin( mYaw.valueRadians() ) * xz;
z = cos( mYaw.valueRadians() ) * xz;
if (mJustFollow)
{
// in this case, don't worry about the orientation of the GoalNode.
goalpos += Ogre::Vector3(x,y,z);
}
else
{
//take the orientation of the GoalNode into account!
Ogre::Quaternion orient = mGoalNode->getWorldOrientation();
Ogre::Matrix3 mat;
orient.ToRotationMatrix( mat );
Ogre::Vector3 xdir = mat.GetColumn(0);
xdir.y = 0.0;
xdir.normalise();
mat.FromEulerAnglesXYZ(Ogre::Radian(0),
Ogre::Math::ATan2(-xdir.z, xdir.x), Ogre::Radian(0) );
orient.FromRotationMatrix( mat );
goalpos += (orient * Ogre::Vector3(x,y,z));
}
// move toward the goal position!
if (deltat > mMaxDelta) { deltat = mMaxDelta; }
togoal = (goalpos - mypos).normalisedCopy() * (goalpos - mypos).length() * 10 * deltat;
if (togoal.squaredLength() > (goalpos - mypos).squaredLength())
togoal = (goalpos - mypos);
mypos += togoal;
if (mypos.y < -3.5 ) { mypos.y = -3.5; }
mCamera->setPosition( mypos );
// look
Ogre::Vector3 goallook;
if (mLookNode)
goallook = mLookNode->getWorldPosition();
else
goallook = mGoalNode->getWorldPosition();
Ogre::Vector3 tolook = (goallook - mLookVec) * (10*deltat);
mLookVec += tolook;
mCamera->lookAt( mLookVec );
}
 
Cualquier comentario o aporte será bienvenido.
 
Saludos kiko

Preguntá. Respondé. Descubrí.
Todo lo que querías saber, y lo que ni imaginabas,
está en Yahoo! Respuestas (Beta).
¡Probalo ya!


Preguntá. Respondé. Descubrí.
Todo lo que querías saber, y lo que ni imaginabas,
está en Yahoo! Respuestas (Beta).
¡Probalo ya!

Vie, 8 de Jun, 2007 12:42 pm

kikogregoris
Sin conexión Sin conexión
Enviar correo Enviar correo

Reenviar Mensaje #15891 de 17205 |
Desplegar mensajes Autor Ordenar por fecha

kiko, Los "saltos", los observaste en la implementación de la pecera con Genesis3D ? Con ese mismo modelo e implementación, estas buscando que no se observe?...
Alejandro F. Reimondo
alereimondo
Sin conexión Enviar correo
7 de Jun, 2007
10:41 pm

Hola Ale You wrote: Los "saltos", los observaste en la implementación de la pecera con Genesis3D ? Hay no es tan notorio pues la velocidad de los objetos no...
kikote gregoris
kikogregoris
Sin conexión Enviar correo
8 de Jun, 2007
12:43 pm
Avanzado

Copyright © 2009 Yahoo! de Argentina S.R.L. Todos los derechos reservados.
Política de privacidad - Condiciones del Servicio - Reglas de la comunidad de Yahoo! - Ayuda