Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Obtener Vector2 a partir de Vector3

Iniciado por combo_heroe, 14 de Septiembre de 2012, 12:25:20 AM

« anterior - próximo »

combo_heroe

Hola el asunto aqui es que estoy desarrollando un juego en 3d y quiero que se dibuje en pantalla un sprite que es en 2D, pero lo que quiero hacer, es ponerlo encima de mis modelos en 3d, lo que tengo es la forma de acceder al Vector3 de mi modelo, pero no se como puedo convertirlo a un vector2 que repessente la posicion actual en la pantalla, para ahi dibujar lo que quiero.

si me pudieran ayudar se los agradeceria bastante.

Saludos.

blau

#1
Pues proyectalo... :)

aquí explico como... ;)

http://stackoverflow.com/questions/10475735/projecting-3d-vector-to-2d-screen-coordinates


Aunque quizás te sería más correcto hacerte una clase tipo QuadRenderer, (si googleas encontrarás el código) donde le pases los 4 puntos en 3D, y te pinte directamente el Quad con la transformación de la cámara... bueno... si quieres que este orientado a la cámara tienes que crear una matriz de tipo billboard... tb hay código por ahí fuera...

:)


WaaghMan

Otra opción es hacer un billboard, y dibujarlo como si fuese 3D, pero con una rotación que haga que siempre mire hacia la cámara (Matrix.CreateBillboard). Depende de lo que quieras hacer con él, la ventaja del billboard es que su tamaño estará en consonancia con el mundo 3D (se hará pequeñito/grande según la distancia a la cámara), de la otra forma su tamaño es lo que le digas en pixels. Como digo, depende de lo que busques.
Milkstone Studios - Autores de Avatar Ninja!, Little Racers, MotorHEAT y Wool en Xbox Live Indie Games

combo_heroe

Hola muchas gracias por sus respuestas, probe http://stackoverflow.com/questions/10475735/projecting-3d-vector-to-2d-screen-coordinates pero no me va para lo que quiero.

Lo que quiero hacer es de la posicion en 3D de algun objeto de mi mundo pueda convertirlo a un sistema de coordenadas de 2d que representen el ancho y alto de la pantalla en pixeles, por ejemplo, si trabajo en una pantalla de 800x600  y tengo la camara apuntando al vector Vector3.Zero quiero obtener la posicion 400,300 (o un vector (0,0) que pueda parsear a lo anterior)

y es que en ejemplo anterior la presentacion del vector2 tiene cierta curvatura cuando la coordenada  Y no tiende a Cero.

¿que podria intentar? no estoy muy seguro de como usar el CreateBillboard soy algo nuevo en XNA

WaaghMan

#4
Lo que dices se hace proyectando a coordenadas de pantalla (Conviertes la posición 3D a coordenadas de dispositivo usando la matriz de proyección de la cámara), y después usar otra transformación para pasarlos a las otras coordenadas.

El código que yo uso cuando quiero algo así es este:


/// <summary>
        /// Applies the camera viewprojection matrix to a point, to convert it from world to screen coordinates.
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public Vector4 ProjectPoint(Vector3 value)
        {
            return Vector4.Transform(new Vector4(value, 1), ViewProjection);
        }

/// <summary>
       /// Applies the inverse camera viewprojection matrix to a point, to convert it from screen to world coordinates.
       /// </summary>
       /// <param name="value"></param>
       /// <returns></returns>
       public Vector4 UnprojectPoint(Vector3 value)
       {
           return Vector4.Transform(new Vector4(value, 1), Matrix.Invert(ViewProjection));
       }

       /// <summary>
       /// Applies the inverse camera viewprojection matrix to a point, to convert it from screen to world coordinates.
       /// </summary>
       /// <param name="value"></param>
       /// <returns></returns>
       public Vector4 UnprojectPoint(Vector4 value)
       {
           return Vector4.Transform(new Vector4(value.ToVector3()/value.W,1), Matrix.Invert(ViewProjection));
       }


/// <summary>
       /// Converts a point between two spaces, for example from a 3D space to a 2D one
       /// </summary>
       /// <returns>True if the conversion could be performed</returns>
       public static bool TransformProjections(Camera sourceCamera, Camera destCamera, Vector3 sourcePos, out Vector3 destPos)
       {
           destPos = Vector3.Zero;
           Vector4 projectedPos = sourceCamera.ProjectPoint(sourcePos);
           if (Math.Abs(projectedPos.W) <= 0.00001f)
               return false;

           Vector3 projectedPos3 = new Vector3(projectedPos.X, projectedPos.Y, projectedPos.Z);
           projectedPos3 /= projectedPos.W;
           Vector4 destPos4 = destCamera.UnprojectPoint(projectedPos3);
           if (Math.Abs(destPos4.W) <= 0.00001f)
               return false;

           destPos = new Vector3(destPos4.X, destPos4.Y, destPos4.Z);
           destPos /= destPos4.W;

           return true;
       }


La propiedad ViewProjection es el resultado de multiplicar la matriz de vista (traslación de la cámara) por su matriz de proyección. El método ToVector3()  es un método de extensión que le puse a Vector4, simplemente es lo mismo que hacer new Vector3(v.X,v.Y,v.Z);
Milkstone Studios - Autores de Avatar Ninja!, Little Racers, MotorHEAT y Wool en Xbox Live Indie Games

combo_heroe

Ok por fin logre, todo gracias a ustedes, mcuhas gracias por sus aportaciones    ^_^






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.