• Create Account

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

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

5 replies to this topic

### #1Synthesizer  Members

188
Like
0Likes
Like

Posted 26 September 2013 - 08:56 AM

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;


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

Synth

Edited by Synthesizer, 26 September 2013 - 09:01 AM.

### #2Seabolt  Members

781
Like
0Likes
Like

Posted 26 September 2013 - 04:18 PM

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).

Perception is when one imagination clashes with another

### #3Synthesizer  Members

188
Like
0Likes
Like

Posted 26 September 2013 - 06:13 PM

hi,

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

### #4Seabolt  Members

781
Like
1Likes
Like

Posted 27 September 2013 - 10:03 AM

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.

Perception is when one imagination clashes with another

### #5Synthesizer  Members

188
Like
0Likes
Like

Posted 29 September 2013 - 06:13 PM

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

### #6Seabolt  Members

781
Like
0Likes
Like

Posted 30 September 2013 - 10:05 AM

Hah, glad you figured it out!

Perception is when one imagination clashes with another

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.