Sign in to follow this  

[XNA] Sprite in 3D World - problem with camera movement

This topic is 1570 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hi guys,
 
it's been long since the last time I worked on my project, so my question may be silly: I've implemented support for sprites (2D images) in my 3D engine. In this case, I don't need the sprites to face the camera, but to remain in their normal position & rotation, as any other 3D object (I think it's called "world-oriented billboard").
 
I've achieved this, but there's a problem: when I move the camera, the sprite will slightly move as well (it's not an optical illusion, it's really moving). I'm almost sure there's something missing in my shaders, although I cannot get to understand why this is happening. I've checked several times the HLSL & I cannot find anything. Also checked the vertex declaration & I find nothing.

 

(I think the erroneous translation may be the camera's delta in the opposite way: you 'look' up in a 10º angle : the sprite moves down in a 10º angle. Although I'm not sure it's exactly like this, it may be something about it).

 

I attach HLSL Vertex Shader code & images: 

VS_OUTPUT output;

// Calculate the position of this billboard vertex.

float3 position = input.Position;
position.x+=(input.TexCoord.x) * width;
position.y+=(input.TexCoord.y) * height;

    
// Apply the camera transform.
float4 viewPosition = mul(float4(position, 1), View);
output.Position = mul(viewPosition, Projection);

output.TexCoord = input.TexCoord;
    
    
// Compute lighting.
float diffuseLight = max(-dot(input.Normal, LightDirection), 0);
    
output.Color.rgb = diffuseLight * LightColor + AmbientColor;
output.Color.a = 1;
    
return output;
[sharedmedia=gallery:images:4303]
[sharedmedia=gallery:images:4304]

Do you think you can help me with this one?
Thanks so much!

 

Synth

Edited by Synthesizer

Share this post


Link to post
Share on other sites

How are you determining the position of the billboard? Also I would scale by width and height after the transform, since you're scaling an arbitrary point in space by a homogenous value, (assuming the width and height are in pixels).

Share this post


Link to post
Share on other sites

hi,

thanks for your answer.
I'm not sure I understand what you mean. I arbitrarily set the position of it, according to where I want it to be:

int i=0;

sprite.vertexPositionNormalTexture[i++] = new VertexPositionNormalTexture(sprite.position, sprite.normal, new Vector2(0, 0));
sprite.vertexPositionNormalTexture[i++] = new VertexPositionNormalTexture(sprite.position, sprite.normal, new Vector2(1, 0));
sprite.vertexPositionNormalTexture[i++] = new VertexPositionNormalTexture(sprite.position, sprite.normal, new Vector2(1, 1));
sprite.vertexPositionNormalTexture[i++] = new VertexPositionNormalTexture(sprite.position, sprite.normal, new Vector2(0, 0));
sprite.vertexPositionNormalTexture[i++] = new VertexPositionNormalTexture(sprite.position, sprite.normal, new Vector2(1, 1));
sprite.vertexPositionNormalTexture[i++] = new VertexPositionNormalTexture(sprite.position, sprite.normal, new Vector2(0, 1));

sprite.vertexBuffer.SetData(sprite.vertexPositionNormalTexture);

For the moment it's static: I'm not translating, rotating or scaling it during gameplay (i'm just setting it's size in the VS).

"I would scale by width and height after the transform" - what do you mean? After the camera transform in the VS? If I do that, it will even be worse, as it's going to be camera-oriented i think : will always face the camera & move together with it.

 

I can be completely wrong though, I'm not in my brightest days :)

Share this post


Link to post
Share on other sites

Hey! It's no problem, I'm making a couple of assumptions about your points that I should have asked about.
Also you're right, applying the scale for the corners would be screen aligned, so that's my mistake.

I'm not seeing anything too far off in your shader. You're not applying a world transform (unless it's already in your view matrix), so the object is in model space, but that shouldn't be an issue. I would check your view matrix and make sure there's nothing wrong there.

Sorry that I'm not more help.

Share this post


Link to post
Share on other sites

Oh boy!! Thanks so much! It was actually not the view, but the perspective one! I was erroneously recalculating it each frame (why?! lol), and more over, recalculating it with a different field of view (PI/4) than the camera one (PI/3)!
 

So your suggestion made me check the matrices code & find the mistake. Now it works like a charm!! So thanks a ton!!! :)

 

Synth

Share this post


Link to post
Share on other sites
Sign in to follow this