Cómo rotar un sistema de partículas para que no gire alrededor del eje del mundo

Tengo un problema al intentar rotar mi sistema de partículas. En primer lugar, no estoy tratando de rotar cada partícula para tratar de mejorar un efecto, lo que estoy tratando de hacer es rotar la posición del emisor. entonces, por ejemplo, si tengo una posición de emisor en 0,0,0 y emito partículas -5 y 5 en los ejes x y z, terminaré emitiendo partículas de forma cuadrada que está en línea con los ejes del mundo. Lo que quiero es rotar esto para que emita exactamente lo mismo pero girado alrededor del punto emisor.

 // Each particle point is converted to a quad (two triangles)
[maxvertexcount(4)]  
void mainGSDraw
(
point VS_VertIn                  inParticle[1], // One particle in, as a point
inout TriangleStream<GS_VertOut> outStrip       // Triangle stream output, a quad containing two triangles
)
{
// Camera-space offsets for the four corners of the quad from the particle centre
// Will be scaled depending on distance of the particle
const float3 Corners[4] =
{
    float3(-1,  1, 0),
    float3( 1,  1, 0),
    float3(-1, -1, 0),
    float3( 1, -1, 0),
};

// Texture coordinates for the four corners of the generated quad
const float2 UVs[4] = 
{ 
    float2(0,1), 
    float2(1,1),
    float2(0,0),
    float2(1,0),
};

const float3x3 RotY = 
{ 

    cos(rotationAngle),0,sin(rotationAngle), 
    0,1,0,
    -sin(rotationAngle),0,cos(rotationAngle)
};
GS_VertOut outVert; // Used to build output vertices

// Output the four corner vertices of a quad centred on the particle position
[unroll]
for (int i = 0; i < 4; ++i)
{
    // Use the corners defined above and the inverse camera matrix to calculate each world
    // space corner of the quad

    float3 corner = Corners[i] * inParticle[0].Scale;   // scale first
    float3 worldPosition;


worldPosition = mul(inParticle[0].Position + mul( corner, (float3x3)InvViewMatrix), RotY) ;   // face the camera
    // Transform to 2D position and output along with an appropriate UV
    outVert.ViewportPosition = mul( float4(worldPosition, 1.0f), ViewProjMatrix );
    outVert.TexCoord = UVs[i];
    outStrip.Append( outVert );
}
outStrip.RestartStrip();

} Arriba está el código para mi función de dibujo del sombreador de geometría, entra una partícula como un punto y se expande a un cuádruple, se escala y luego se calcula la posición mundial. El cálculo de rotación es incorrecto si el sistema de partículas está en el origen, gira el sistema exactamente como lo quiero, pero tan pronto como lo muevo, gira alrededor del origen, así que mi pregunta es cómo hacer esta rotación alrededor del origen del emisor. no el mundo cero? El código se ha reducido, por lo que no es necesario responder que este código podría no funcionar.

preguntado el 03 de mayo de 12 a las 16:05

Tienes que hacer ese tipo de cálculos: 1 - Traslación del punto emisor al eje del mundo. 2 - Haz que gire alrededor de ese eje. 3 - Tradúzcalo de nuevo a su posición original. Es un método común. Cuando no sabe cómo hacer algo en otro lugar que no sea la posición 0, simplemente traduce, calcula y vuelve a traducir. Debería buscar eso en Internet porque no podré darle detalles confiables o exactos al respecto. -

1 Respuestas

Multiplicarías la traslación de tu partícula desde el origen del emisor por la rotación, luego sumarías la traslación del emisor desde el origen del mundo.

contestado el 04 de mayo de 12 a las 13:05

Sí, saludos amigo, logré hacerlo funcionar haciendo exactamente eso, creé una matriz de rotación y dos matrices de traducción, una de ellas es la inversa, hice lo anterior y funcionó perfectamente. Para cualquier otra persona que lea, comienzo con la posición del emisor. que luego se traslada de regreso al origen del mundo usando la traducción inversa, haga la rotación y vuelva a trasladar a su posición. ¡Simple cuando sabes cómo! Saludos amigo! - RobBain85

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.