Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Clase vector para DirectX - Drácula

Iniciado por ethernet, 24 de Noviembre de 2002, 05:01:26 PM

« anterior - próximo »

ethernet


    ¿ Necesita explicación ? :)






// vector.h



#ifndef CXVECTOR

#define CXVECTOR



class CXMatriz;



class CXVector:public D3DXVECTOR3 {

public:

CXVector() {};

CXVector(float xyz) { x=xyz;y=xyz;z=xyz; };

CXVector(const CXVector &origen);

CXVector(float x,float y,float z);

CXVector &Normalizar();

CXVector NormalizarNuevo();

float ProductoEscalar(const CXVector &v);

CXVector ProductoVectorial(const CXVector &v1);

float Magnitud();

void ResetAlMaximo(); // Asigna un nº máximo

CXVector &operator /(float escalar);

CXVector &operator *=(const CXMatriz &m);

friend CXVector operator *(const CXVector &v,const CXMatriz &m);

friend CXVector operator -(CXVector &a,CXVector &b);

friend CXVector operator -(CXVector &a);

friend CXVector operator +(CXVector &a,CXVector &b);

friend CXVector operator *(CXVector &a,float escalar);

friend CXVector operator *(float escalar,CXVector &a);

};



#endif



// vector.cpp

#include "haddd.h"



CXVector::CXVector(float vx,float vy,float vz)

{

x=vx;

y=vy;

z=vz;

}



CXVector::CXVector(const CXVector &v)

{

x=v.x;

y=v.y;

z=v.z;

}



void CXVector::ResetAlMaximo()

{

x=FLT_MAX;

y=FLT_MAX;

z=FLT_MAX;

}

float CXVector::Magnitud()

{

return D3DXVec3Length(this);

}



CXVector &CXVector::Normalizar()

{

D3DXVec3Normalize(this,this);



return *this;

}



CXVector CXVector::NormalizarNuevo()

{ CXVector t;



D3DXVec3Normalize(&t,this);



return t;

}



CXVector CXVector::ProductoVectorial(const CXVector &v1)

{ CXVector t;



D3DXVec3Cross(&t,this,&v1);



return t;

}



float CXVector::ProductoEscalar(const CXVector &v)

{

return D3DXVec3Dot(this,&v);



}



CXVector &CXVector::operator /(float escalar)

{

x/=escalar;

y/=escalar;

z/=escalar;



return *this;

}



CXVector &CXVector ::operator *=(const CXMatriz &m)

{

D3DXVECTOR4 v4;

D3DXVec3Transform(&v4,(D3DXVECTOR3 *)&x,(D3DXMATRIX *)m.m);

x=v4.x;

y=v4.y;

z=v4.z;

return *this;

}





// Funciones amigas



CXVector operator *(CXVector &a,float escalar)

{

CXVector t(a);

t.x*=escalar;

t.y*=escalar;

t.z*=escalar;



return t;

}



CXVector operator *(float escalar,CXVector &a)

{

CXVector t(a);

t.x*=escalar;

t.y*=escalar;

t.z*=escalar;



return t;

}



CXVector operator +(CXVector &a,CXVector &b)

{

CXVector t(a);

t.x+=b.x;

t.y+=b.y;

t.z+=b.z;



return t;

}



CXVector operator -(CXVector &a,CXVector &b)

{

CXVector t(a);

t.x-=b.x;

t.y-=b.y;

t.z-=b.z;



return t;

}



CXVector operator -(CXVector &a)

{

CXVector t;

t.x=-a.x;

t.y=-a.y;

t.z=-a.z;



return t;

}



CXVector operator *(const CXVector &v,const CXMatriz &m)

{

D3DXVECTOR4 v4;

D3DXVec3Transform(&v4,(D3DXVECTOR3 *)&v.x,(D3DXMATRIX *)m.m);

return CXVector(v4.x,v4.y,v4.z);

}










    Éste código fue enviado por Drácula el 22 de noviembre del 2002
dracular@ono.com

Si quieres enviar tu propio código hazlo a  eth_cotd@lycos.es



    Haddd

                                    La próxima vez enviaré el código de mi motor completo.¡¡Jajajajaj!!

    No, en serio, a ver si os animais a mandar cosas, que si no no llegaremos a tener tanta trascendencia como Flipcode                                

    Zaelsius

    No le veo mucho utilidad(sentido) a crear una clase que encapsule D3DXVECTOR(alguna ventaja?).

    Aunque claro, si la gente no envia otros fuentes, pues habrá que publicar lo que haya. A ver si la people se anima!

    Como mejora: incluye una función "DimensionAlCuadrado", que se utiliza mucho y es más rápìda que multiplicar dos veces "dimension".

    CoLSoN2

                                    lo que dice ZealSiuS, teniendo D3DXVECTOR3. .. y lo de DimensionAlCuadrado, si mi variable vector se llama v. Veo más rapido hacer v*v que no v.DimensionAlCuadrado ..                                
    Manuel F. Lara
    Descargar juegos indie  - blog sobre juegos indie y casual
    El Desarrollo Personal.com  - blog sobre productividad, motivación y espíritu emprendedor

    barkley

                                    A mí no me parece mal que se manden clases como esta. Todo el mundo hemos creado una o más (en mi caso, creo que ya van 4 ó 5 iguales...). Pero, quizá, la clase vector sea la más simple de hacer de estas. Sin embargo, creo que sería útil mandar una serie de clases matemáticas (vector, matriz, quaternions...) que pudiesen interactuar entre sí y que sean muy utilizadas, como las que he nombrado antes. Si os parece bien, puedo mandar unas que yo he desarrollado (los quaternions no los tengo todavía), puede que no sean de gran utilidad para la mayoría, pero si las vamos corrigiendo y acelerando entre todos puede que al final sí sean de utilidad (20 ojos ven más que 2).
    Saludos,

    Barkley                                

    ethernet

    Creo q las clases perfectas para vector matrix etc en c++ estan en el cotd de flipcode. Eso si, no se si los q usan DX os podreis permitir usar una clase vector q no sea la q trae DX o derivada.. xDDDD.

    CordayUK

                                    estoy de acuerdo con ethernet, pero no etiendo porque hay que basar la clase en D3DXVECTOR4

    en el caso de que por huevos tengas que usar D3DXVECTOR4, porque no hacer un define que convierta tu objeto vector a este?

    o porque no hacer una union?





    union

    {

      spR32 _value [4][4];

      struct

         {

            spR32     _11,_12,_13,_14,

                          _21,_22,_23,_24,

                          _31,_32,_33,_34,

                          _41,_42,_43,_44;

          };

          D3DMATRIX _DX;

    };





    esto es lo que utilizo yo porque el cabron de DX requiere un D3DXMATRIX para SetTransform etc...  :)                                






    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.