Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Menu

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menu

Mensajes - davidgf

#1
Programación gráfica / Re: Proyectar vértice OpenGL
14 de Noviembre de 2009, 12:21:33 AM
Ostras vaia  jalada! gracias! Al final lo he implementado sin gluproject, multiplicando las matrices modelview y project, trasponiendo y transformando.
#2
Programación gráfica / Proyectar vértice OpenGL
12 de Noviembre de 2009, 10:13:36 PM
Hola de nuevo a todos!

Tengo un problema con proyectar un vertice en una coordenada 2D. La solución es:

   GLdouble modelMatrix[16];
   GLdouble projMatrix[16];
   GLint viewport[4];
   GLdouble ox,oy,oz;

   glGetDoublev(GL_MATRIX_MODE, modelMatrix);
   glGetDoublev(GL_PROJECTION_MATRIX, projMatrix);
   glGetIntegerv(GL_VIEWPORT, viewport);
   
   gluProject (vec3d.x,vec3d.y,vec3d.z,modelMatrix,projMatrix,viewport,&ox,&oy,&oz);

donde ox y oy estan entre {-0,5 , 0,5 }. Pero el programa me saca coordenadas mayores o menores de 0.5 aun estando el punto en pantalla o +/- inf.

Porque sucede esto?

Gracias

David
#3
Programación gráfica / Re: Colisiones en una CPU saturada
24 de Julio de 2009, 12:59:37 AM
Buenas!

Si lo implementas tu solito tendrás que buscarte la vida!
En las librerías de física depende:
En ODE, que es una librería discreta en tiempo, no comprueba eso, por esa razón no se le puede decir a ODE que simule de golpe un salto de medio segundo, ya que pasa lo que dices tu, se pasa de la pared.
En cambio y si no me equivoco Bullet es contínua y intenta evitar eso mismo.

Saludos!
#4
General Programadores / Re: Colision de cámara
21 de Julio de 2009, 04:27:58 PM
Si si, lo de interpolar es xaxi, pero no me dirve en un motor de fisica, puesto que no puedo modificar la posicion directamente. Miraré lo del muelle a ver.

Gracias!
#5
General Programadores / Colision de cámara
18 de Julio de 2009, 02:23:58 PM
Buenas!

Tengo unas dudas que quería comentaros.
Cómo hago una cámara que no colisione con el mundo.
Siempre lo había hecho usando un rayo para calcular el punto necesario, pero ahora uso ODE para todo el mundo y simular los moviminetos de los vehiculos, así que quería modelar la cámara como una esfera...
Cómo debería hacerlo? Cuando quiero cambiar la posición de la cámara no puedo hacerlo "a saco", tengo que aplicar una fuerza o una velocidad, y ahi la cosa se complica...

Alguien tiene alguna sugerencia/truco??

Muchas gracias!

David
#6
General Programadores / Re: VB6 & MySQL
05 de Julio de 2009, 02:13:21 AM
Te refieres a conectarte desde un programa en VB 6 en tu PC a una base de datos en un servidor??
SI que se puede, lo que sucede es que el 99,999% de los servidores mysql solo aceptan conexiones locales, por esa razón sólo los programas alojados en el servidor puede acceder (ya sean php, cgi-bin, etc...)
Es más si pruebas a conectarte a tu base de datos local (en tu PC) des de otro PC de casa tuya lo más probable es que te mande de paseo.
Yo tuve este problema en una red local donde había un PC con server MySql y tuve que cambiar los permisos con GRANT (es una consulta SQL, lo hice des de la interfaz de MySQL tools) y luego hacer un FLUSH.

Logicamente si el servidor no es tuyo no podrás cambiar los accesos, como mucho pedirselo al admin del server.
Un par de links:
http://www.cyberciti.biz/tips/how-do-i-enable-remote-access-to-mysql-database-server.html
http://dev.mysql.com/doc/refman/5.1/en/grant.html

Si no tienes alternativa yo hice un truco más cutre. Necesitava que un programa local se conectara a internet i accediera a BD, e hice unos scripts en PHP que me devolvían los resultados de las consultas SQL que realizaba.

Funcionaba bastante bien, incluso guardaba pequeños archivos en Base64.

Saludos!

David
#7
General Programadores / Exportar física
31 de Mayo de 2009, 12:51:45 PM
Hola a todos!

Sé que esto es un tema más de modelado que de disenño, pero yo siempre pienso en resolver las cosas programando, que es lo que sé...
Mi objetivo es modelar objetos i asignarles un modelo fisico hecho de cajas, esferas y cilindros.
Cómo puedo exportar esas cajas de colision que dibujo en 3ds max???
Había pensado en que si son cajas alineadas con los ejes podia simplemente hacer un pequeño algoritmo que me calculara las dimensiones de la caja i la posición.
Pero si quiero hacerlo con qualquier caja necesito además calcular la rotación del elemento, cosa que para mí no es trivial.

Alguna idea o programa que me ayude en esto? Mejor si es Open Source! Es para un pequeño proyecto de PSP.

Saludos y gracias a todos!!
#8
General Programadores / Re: Matriz invalida (C++)
22 de Febrero de 2009, 11:09:01 PM
Aps perdona, pero yo lo hacía para que vieras una implementación ya funcional y pudieras comparar o ver cómo lo hago yo.
Inspiración, ya me entiendes ;)

Saludos!
#9
General Programadores / Re: Matriz invalida (C++)
22 de Febrero de 2009, 06:40:15 PM
Ahi va un pequeño template que hice yo para un programa de resolver circuitos lineales:

Código (cpp) [Seleccionar]

/*
Matrices template by davidgf (www.davidgf.net)
*/

#include <iostream>
#include <vector>

template <typename T>

class Matrix {
private:
int rows, cols, cells;
std::vector <T> mat;
public:
Matrix(int n, int m) {
mat = std::vector <T> (n*m); rows = n; cols = m; cells = n*m;
for (int i = 0; i < cells; i++) mat[i] = T();
}
~Matrix() { }
void SetValue (int i, int j, T value) { mat[i*cols+j] = value; }
int NumCols () { return cols; }
int NumRows () { return rows; }

T operator() (int i, int j) { return mat[i*cols+j]; }

Matrix operator/( const T &a ) {
Matrix<T> ret(rows,cols);
for (int i = 0; i < cells; i++) ret.mat[i] = this->mat[i] / a;
return ret;
}

// SUMA
Matrix operator+( const Matrix &a ) {
Matrix<T> ret(rows,cols);
for (int i = 0; i < cells; i++) ret.mat[i] = a.mat[i] + this->mat[i];
return ret;
}
// CANVIO SIGNO
Matrix operator-() {
Matrix<T> ret(rows,cols);
for (int i = 0; i < cells; i++) ret.mat[i] = -this->mat[i];
return ret;
}
// RESTA
Matrix operator-( const Matrix &a ) {
Matrix<T> ret(rows,cols);
for (int i = 0; i < cells; i++) ret.mat[i] = this->mat[i] - a.mat[i];
return ret;
}
// MULTIPLICACIÓN
Matrix operator*( const Matrix &a ) {
Matrix<T> ret(this->rows,a.cols); // (a,b) * (b,c) = (a,c) (matrix rows, cols)
if (this->cols != a.rows) {
std::cout << "MATRIX ERROR: Cannot multiply the matrices because of their size!" << std::endl;
return ret;
}
for (int i = 0; i < this->rows; i++) {
for (int j = 0; j < a.cols; j++) {
T accum = T();
for (int k = 0; k < a.rows; k++) accum = accum + this->mat[i*this->cols+k]*a.mat[k*a.cols+j];
ret.mat[i*ret.cols+j] = accum;
}
}
return ret;
}
// SUMA ESCALAR
Matrix operator+( const T &a ) {
Matrix<T> ret(rows,cols);
for (int i = 0; i < cells; i++) ret.mat[i] = this->mat[i] + a;
return ret;
}
// RESTA ESCALAR
Matrix operator-( const T &a ) {
Matrix<T> ret(rows,cols);
for (int i = 0; i < cells; i++) ret.mat[i] = this->mat[i] - a;
return ret;
}
// MULT ESCALAR
Matrix operator*( const T &a ) {
Matrix<T> ret(rows,cols);
for (int i = 0; i < cells; i++) ret.mat[i] = this->mat[i]*a;
return ret;
}
// MATRIZ Adjunta A UN ELEMENTO
Matrix Ajoint (int r, int c) {
Matrix<T> ret(rows-1,cols-1);
if (this->cols != this->rows) {
std::cout << "MATRIX ERROR: Minor() calculation error, non-square matrix!" << std::endl;
return ret;
}

for (int i = 0, i2 = 0; i < rows; i++) {
if (i != r) {
for (int j = 0, j2 = 0; j < cols; j++) {
if (j != c) {
ret.mat[i2*ret.cols+j2] = this->mat[i*cols+j];
j2++;
}
}
i2++;
}
}
return ret;
}
// DETERMINANTE  (asume que la matriz es cuadrada ;)
T Det() {
if (this->cols == 1 and this->rows== 1) return this->mat[0];
if (this->cols != this->rows) {
std::cout << "MATRIX ERROR: Det() calculation error, non-square matrix!" << std::endl;
return T();
}
T accum = T();
bool osc = true;
for (int i = 0; i < this->cols; i++) {
if (osc) {
accum = accum + this->mat[i]*this->Ajoint(0,i).Det();
}else{
accum = accum - this->mat[i]*this->Ajoint(0,i).Det();
}
osc = not osc;
}
return accum;
}
Matrix Inverse () {
Matrix<T> ret(rows,cols);
if (this->cols != this->rows) {
std::cout << "MATRIX ERROR: Det() calculation error, non-square matrix!" << std::endl;
return ret;
}
if (this->cols == 1 and this->rows== 1) {
ret.mat[0] = T(1) / this->mat[0];
return ret;
}
for (int i = 0; i < this->cols; i++) {
for (int j = 0; j < this->cols; j++) {
if ( (i+j) % 2 == 0) ret.mat[i*cols+j] = this->Ajoint(i,j).Det();
else ret.mat[i*cols+j] = -this->Ajoint(i,j).Det();
}
}
return ret/this->Det();
}

void Print () {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
std::cout << this->mat[i*cols+j].real << " " << this->mat[i*cols+j].imag << "i   ";
}
std::cout << std::endl;
}
}


};



Es un template asi que puedes usarla con qualquier tipo de datos, int, double, float... etc
Yo la uso con complejos:

Código (cpp) [Seleccionar]

/*
Complex Numbers template by davidgf (www.davidgf.net)
*/

#include <iostream>
#include <vector>
#include <math.h>

template <typename T>

class Complex {
public:
T real, imag;

Complex() { real=0; imag=0; }
Complex (T real, T imag) { this->real = real; this->imag = imag; }
Complex (T real) { this->real = real; this->imag = 0; }
~Complex() {}

// SUMA
Complex Conj() const { return Complex (real, -imag); }
Complex ModQ() const { return Complex (real*real+imag*imag, T()); }

// SUMA
Complex operator+( const Complex &a ) { return Complex (real+a.real, imag+a.imag); }
// CANVIO SIGNO
Complex operator-() { return Complex (-real, -imag); }
// RESTA
Complex operator-( const Complex &a ) { return Complex (real-a.real, imag-a.imag); }
// MULTIPLICACIÓN
Complex operator*( const Complex &a ) { return Complex(real*a.real-imag*a.imag, real*a.imag+a.real*imag); }
// DIV
Complex operator/( const Complex &a ) {
T den = a.ModQ().real;
Complex ret = *this * a.Conj();
ret.real = ret.real / den;
ret.imag = ret.imag / den;
return ret;
}

T Arg () const {
if (imag > T() and real > T()) {  // 1r q
return (T)atan(imag/real)*(T)180/M_PI;
}else if (imag > T() and real < T()) {  // 2n q
return (T)atan(imag/real)*(T)180/M_PI+(T)180;
}else if (imag < T() and real < T()) {  // 3r q
return (T)atan(imag/real)*(T)180/M_PI+(T)180;
}else{  // 4t q
return (T)atan(imag/real)*(T)180/M_PI+(T)360;
}
}


};
#10
Programación gráfica / Re: Transparencias y sombras
08 de Febrero de 2009, 01:09:13 PM
Jo.. vaia, pensaba que alguien habría encontrado un truco o alguna chapuza...
Estaba pensando que podía usar lightmapping en los polígonos afectados por la sombra de objetos transparentes.. pero es un rollo....
O eso o hacer como quake  y no usar vegetación, pero pierde la gracia...

Saludos y gracias!
#11
Programación gráfica / Transparencias y sombras
04 de Febrero de 2009, 03:59:10 PM
Buenas!

Alguien me da ideas de cómo usar stencil shadows a la vez que crear vegetación decente?? No se me ocurre cómo lo puedo hacer...
Alguna idea? He buscado cómo lo hacen los juegos comerciales y tal, pero parece que la evitan simplemente.

Gracias!
#12
Programación gráfica / Re: Strided data in DX9
02 de Febrero de 2009, 04:26:54 PM
Parece que sí, aunque es muy extraño verdad? No tengo ni idea de shaders de DX8 pero parecen muy extraños, ya que les indicas de donde coges los datos.
En Opengl es mucho más práctico, bindeas el buffer ya sea de un VBO, o de donde sea y él lo hace todo por ti verdad? No se, espero que algun alma bondadosa nos ilumine!

Saludos!
#13
Programación gráfica / Re: Strided data in DX9
01 de Febrero de 2009, 09:13:29 PM
SI lo he entendido bien quieres tener varios buffers (uno de vertices, otro de normales, otro de coordenadas de textura...) y poder enviarlos como en opengl con las funciones gl*Pointer no?? Yo hice algo así pero diría que usaba shaders... te pego el código en VB, hace un par de años así que ni idea de cómo apareció ahí. xD Aviso que es DX8!

Para crear y "bindear" los buffers...


    Set VertexBuffer = Device.CreateVertexBuffer(NumVertices * 12, D3DUSAGE_WRITEONLY, D3DFVF_XYZ, D3DPOOL_MANAGED)
    Set UVBuffer = Device.CreateVertexBuffer(NumVertices * 8, D3DUSAGE_WRITEONLY, D3DFVF_TEX1, D3DPOOL_MANAGED)
    Set Indexbuffer = Device.CreateIndexBuffer(NumFaces * 12, D3DUSAGE_WRITEONLY, D3DFMT_INDEX32, D3DPOOL_MANAGED)

    D3DVertexBuffer8SetData VertexBuffer, 0, NumVertices * 12, 0, vertices(0)
    D3DVertexBuffer8SetData UVBuffer, 0, NumVertices * 8, 0, uvcoords(0)
    D3DIndexBuffer8SetData Indexbuffer, 0, NumFaces * 12, 0, indices(0)

 
    Device.SetStreamSource 0, VertexBuffer, 12    'buffer 0, vertices
    Device.SetStreamSource 1, UVBuffer, 8    'buffer 1 , coord tex
    Device.SetMaterial EmptyMaterial

    Device.SetVertexShader CharShader


El CharShader que uso es este de aqui...


Public Sub CreateVertexSahders()

If VSCapable = False Then Exit Sub

Dim decl(5) As Long

decl(0) = D3DVSD_STREAM(0)     ' buffer 0
decl(1) = D3DVSD_REG(D3DVSDE_POSITION, D3DVSDT_FLOAT3)   ' vertices
decl(2) = D3DVSD_STREAM(1)    'buffer 1
decl(3) = D3DVSD_REG(D3DVSDE_TEXCOORD0, D3DVSDT_FLOAT2)   'coordenadas de textura
decl(4) = D3DVSD_END()
Call Device.CreateVertexShader(decl(0), ByVal 0, CharShader, 0)
End Sub

Public Sub ReleaseVertexShaders()
If VSCapable = False Then Exit Sub
Device.DeleteVertexShader CharShader
End Sub


Todas las constantes o funciones de shader esas raras las saque de un .BAS de microsoft de unos ejemplos de DX8 me parece... pero deberían funcionar bien en DX9 no??

Como ves tengo un buffer de vertices, de coordenadas de textura y de índices, separados.

Saludos!!
#14
Programación gráfica / Re: Pregunta rápida sobre Shaders
01 de Febrero de 2009, 09:03:17 PM
Me suena que ya me lo habías preguntado no? jejej
Es que mi grafica no soporta de los otros diría... Además para lo que quiero hacer voi que me mato con estos.
Así no tienes ni idea de la respuesta? Es que en el peazo txt de especificación no hay nada que hable de ello... Quizás debería preguntar en os foros de opengl.org

Saludos y gracias!
#15
Programación gráfica / Re: Strided data in DX9
29 de Enero de 2009, 11:16:15 PM
Qué quiere decir strided data?? Podrías explicarlo para tontos porfa?






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.