Multiple projectings in a scene graph

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

Recommended Posts

Although I am writing this with regards to XNA, this is more of a generalized question about using multiple projections for varying objects on my scene graph. My game engine is structured as a tree, and the tree can contain a mix of models / sprites; with sprites being dynamically textured quads. My vertices are setup in local space and transformed into world space prior to rendering. As it stands, most objects are childed to the root scene ( Matrix.Identity ) so everyone's coordinates are more or less in world space... So now to my question :) How do you align the orthographic projection of the sprite so that it is always pixel perfect in the render but mantain its depth value in the scene ? My 3D objects are using the following projection: ProjectionMatrix = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, _graphicsDevice.Viewport.AspectRatio, 0.01f, 10000); ViewMatrix = Matrix.CreateLookAt(Vector3.Backward, Vector3.Forward, Vector3.Up); and if I use this projection for my sprites, I get a less than accurate floating billboard (expected). In my sprite class I try to use an orthographic projection: renderer.BasicEffect.World = renderer.WorldMatrix; renderer.BasicEffect.View = renderer.ViewMatrix; renderer.BasicEffect.Projection = Matrix.CreateOrthographic(1920, 1080, 1, 10000); //renderer.ProjectionMatrix; and the billboards are rendered perfectly but then do not appear behind or in front of the model accordingly. Idealing, a 3d object at z = 0 and 2 sprites at z = 1000 and z =-1000 would wield a render of SPRITE - MODEL - SPRITE.... What I am seeing right now is a SPRITE - SPRITE - MODEL My vertices are set every frame and are straight foward: Vector2 textureUpperLeft = new Vector2(0.0f, 0.0f); Vector2 textureUpperRight = new Vector2(1.0f, 0.0f); Vector2 textureLowerLeft = new Vector2(0.0f, 1.0f); Vector2 textureLowerRight = new Vector2(1.0f, 1.0f); Vertices[0].Position = new Vector3(0, -Height, 0); Vertices[0].TextureCoordinate = textureLowerLeft; Vertices[1].Position = new Vector3(0, 0, 0); Vertices[1].TextureCoordinate = textureUpperLeft; Vertices[2].Position = new Vector3(Width, -Height, 0); Vertices[2].TextureCoordinate = textureLowerRight; Vertices[3].Position = new Vector3(Width, 0, 0); Vertices[3].TextureCoordinate = textureUpperRight; Vertices[0].Position = Vector3.Transform(Vertices[0].Position, LocalToWorld); Vertices[1].Position = Vector3.Transform(Vertices[1].Position, LocalToWorld); Vertices[2].Position = Vector3.Transform(Vertices[2].Position, LocalToWorld); Vertices[3].Position = Vector3.Transform(Vertices[3].Position, LocalToWorld); Any ideas would be a big help. An alternative method might be, how do I create the verts off a perspective matrix such that they are aligned on the screen orthagonally

Share on other sites
I think you need to reorder your nodes based on depth. The position in world coordinates is used to work out things such as size and rotation, but not draw order.

1. 1
2. 2
3. 3
Rutin
24
4. 4
5. 5
khawk
14

• 11
• 11
• 23
• 10
• 9
• Forum Statistics

• Total Topics
633651
• Total Posts
3013128
×