*korte uitleg probleem, door een probleem met een bonetransform wil een zelfgemaakt model bestaande uit een langwerpig blok en op de top een rondje er niet normaal uit zien, het rondje komt met origin op 0.0 van het model. Ook zie ik geen textures (maar ben er niet 100% zeker van of dat al zou moeten kunnen)
*uitgebreide uitleg
Zoals velen van jullie weten heeft microsoft een tijdje terug XNA gelanceerd een soort van framework om games te maken iets makkelijker te maken. Maar ik denk/hoop dat deze vraag ook te volgen is als je direct met DirectX werkt.
Ik heb zelf een beetje gespeeld met XNA en heb veel fun gehad met lelijke zelfgemaakte modelletjes tekene (jeej) en deze in mijn engine pleuren, flink laten schudden en er met mijn cameratje er om heen bewegen.
Nu had ik eerst een rendering dmv van
Naar de hand van deze microsoft tutorial codesample wilde ik is gaan proberen om een beetje licht te scheppen.
Ik heb dus een apparte renderingclass gemaakt *chique* naar voorbeeld van het bovenstaande tutorial codesample.
Er is alleen 1 verschil, in mijn code werd er nooit een WorldMatrix aangemaakt (projection en view was somehow genoeg voor mijn camera) dit heb ik opgevangen door gewoon maar vanuit mijn cameraclass dit te doen
Nu zie ik het object op de goede positie en ook de lightning is dik in orde, maar mijn zelfgemaakte model bestaat uit 2 modellen, een uitgerekt blok en aardbol op de top. Maar als ik nu de game launch zie ik dat de aardbol niet op de top zit, maar op punt 0,0 van het model, als ik het model heen en weer verschuif blijft alles wel netjes aan elkaar plakken.
Ook zie ik nog geen textures, maar gewoon de kleur licht die ik ingesteld heb. De informatie voor de textures is er wel, want als ik in dezelfde loop als waarin het vertexlighted model getekend wordt weer
Zet krijgt die wel textures (maar dan weer geen lightning. Uit het codevoorbeeld wordt me niet helemaal duidelijk of deze manier van renderen de textures wel weer geeft.
Ik denk dat ergens in de VertexLightning code ook een "=BoneTransforms[mesh.P" etc.. moet komen te staan, of iig een manier om te BoneTransformen, maar ik kan het goede stukje niet vinden in de volgende lap code: (heb er wat dingetjes tussenuitgehaal)
EDIT: Ik heb even de 3DSMax teapot betextured en in mijn programma alswel de VL demo van MS gepropt. Hij krijgt daar iig ook geen textures dus dat is geen probleem door foute code(of nouja het is wel een probleem voor mij
, tips om dat voor elkaar te krijgen zijn erg welkom!)
Verder heeft de teapot niet meerdere bones (is getransformed uit 1 stuk ofzo?) en is daarom wel heel en goed belicht
*uitgebreide uitleg
Zoals velen van jullie weten heeft microsoft een tijdje terug XNA gelanceerd een soort van framework om games te maken iets makkelijker te maken. Maar ik denk/hoop dat deze vraag ook te volgen is als je direct met DirectX werkt.
Ik heb zelf een beetje gespeeld met XNA en heb veel fun gehad met lelijke zelfgemaakte modelletjes tekene (jeej) en deze in mijn engine pleuren, flink laten schudden en er met mijn cameratje er om heen bewegen.
Nu had ik eerst een rendering dmv van
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
| public virtual void Draw(GameTime gameTime, Matrix projection, Matrix view) { foreach (ModelMesh mesh in Model3D.Meshes) { foreach (BasicEffect effect in mesh.Effects) { effect.View = view; effect.Projection = projection; effect.World = BoneTransforms[mesh.ParentBone.Index] * WorldTransformMatrix; } mesh.Draw(); } } |
Naar de hand van deze microsoft tutorial codesample wilde ik is gaan proberen om een beetje licht te scheppen.
Ik heb dus een apparte renderingclass gemaakt *chique* naar voorbeeld van het bovenstaande tutorial codesample.
Er is alleen 1 verschil, in mijn code werd er nooit een WorldMatrix aangemaakt (projection en view was somehow genoeg voor mijn camera) dit heb ik opgevangen door gewoon maar vanuit mijn cameraclass dit te doen
C#:
1
| worldMatrix = Matrix.CreateFromQuaternion(objectRotation); |
Nu zie ik het object op de goede positie en ook de lightning is dik in orde, maar mijn zelfgemaakte model bestaat uit 2 modellen, een uitgerekt blok en aardbol op de top. Maar als ik nu de game launch zie ik dat de aardbol niet op de top zit, maar op punt 0,0 van het model, als ik het model heen en weer verschuif blijft alles wel netjes aan elkaar plakken.
Ook zie ik nog geen textures, maar gewoon de kleur licht die ik ingesteld heb. De informatie voor de textures is er wel, want als ik in dezelfde loop als waarin het vertexlighted model getekend wordt weer
C#:
1
2
3
4
5
6
7
| foreach (BasicEffect effect in mesh.Effects) { effect.View = view; effect.Projection = projection; effect.World = BoneTransforms[mesh.ParentBone.Index] * WorldTransformMatrix; } mesh.Draw(); |
Zet krijgt die wel textures (maar dan weer geen lightning. Uit het codevoorbeeld wordt me niet helemaal duidelijk of deze manier van renderen de textures wel weer geeft.
Ik denk dat ergens in de VertexLightning code ook een "=BoneTransforms[mesh.P" etc.. moet komen te staan, of iig een manier om te BoneTransformen, maar ik kan het goede stukje niet vinden in de volgende lap code: (heb er wat dingetjes tussenuitgehaal)
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
| public void Draw(GameTime gameTime, ModelHandler modelHandler, GraphicsDeviceManager graphics) { //Nu gaan we het eigenlijke model drawen foreach (ModelMesh mesh in modelHandler.Model3D.Meshes) { for (int i = 0; i < mesh.MeshParts.Count; i++) { ModelMeshPart meshPart = mesh.MeshParts[i]; //set the vertex source to the mesh's vertex buffer graphics.GraphicsDevice.Vertices[i].SetSource( mesh.VertexBuffer, meshPart.StreamOffset, meshPart.VertexStride); //set the vertex delclaration graphics.GraphicsDevice.VertexDeclaration = meshPart.VertexDeclaration; //set the current index buffer to the sample mesh's index buffer graphics.GraphicsDevice.Indices = mesh.IndexBuffer; //figure out which effect we're using currently //VL is de naam van het VertexLightning effect Effect effect = VLt; //at this point' we're ready to begin drawing //To start using any effect, you must call Effect.Begin //to start using the current technique (set in LoadGraphicsContent) effect.Begin(SaveStateMode.None); //now we loop through the passes in the teqnique, drawing each //one in order for (int y = 0; y < effect.CurrentTechnique.Passes.Count; y++) { //EffectPass.Begin will update the device to //begin using the state information defined in the current pass effect.CurrentTechnique.Passes[y].Begin(); //modelHandler.Model3D.Meshes contains all of the information required to draw //the current mesh graphics.GraphicsDevice.DrawIndexedPrimitives( PrimitiveType.TriangleList, meshPart.BaseVertex, 0, meshPart.NumVertices, meshPart.StartIndex, meshPart.PrimitiveCount); //EffectPass.End must be called when the effect is no longer needed effect.CurrentTechnique.Passes[y].End(); } //Likewise, Effect.End will end the current technique effect.End(); } //mesh.Draw(); } } |
EDIT: Ik heb even de 3DSMax teapot betextured en in mijn programma alswel de VL demo van MS gepropt. Hij krijgt daar iig ook geen textures dus dat is geen probleem door foute code(of nouja het is wel een probleem voor mij
Verder heeft de teapot niet meerdere bones (is getransformed uit 1 stuk ofzo?) en is daarom wel heel en goed belicht
[ Voor 3% gewijzigd door roy-t op 29-09-2007 23:04 ]
