Seite 1 von 2

3D Versuche: Würfel + Textur

Verfasst: 19.06.2010 18:23
von NathanielBlack
Ich habe eben grad mit der 3D Programmierung in PB angefangen. Ist absolutes Neuland für mich.
Nun will ich auf mein Europa (eine Heighmap) einen Würfel positionieren.

Aber dafür brauch ich ein Würfel-Model und ne Textur dazu. (Brauch ich sonst noch was dafür)?

Kann mir jemand die benötigten Sachen für einen Würfel geben? Das wäre echt nett:)

LG und Danke im Vorraus,
NathanielBlack

Re: 3D Versuche: Würfel + Textur

Verfasst: 19.06.2010 18:40
von hörmi
Schau mal unter Examples "MeshManual.pb" an, da ist alles was du für einen würfel brauchst drin

Re: 3D Versuche: Würfel + Textur

Verfasst: 19.06.2010 19:07
von NathanielBlack
Klappt aber irgendwie immer noch nicht. Die "Stadt" wird auf der Karte nirgens angezeigt.

Wäre nett wenn sich jemand das mal anschauen würde und mir sagt, was falsch ist;)
http://www.speedyshare.com/files/23035535/terrain.zip

Also ich weiß grad net, ob ich in dieser "Version" die Koordianten beim Entity angegeben habe, aber mit oder ohne war egal- es ging immer nicht.

Und es wäre gut, wenn ich so nen Würfel als richtiges Model mit Textur hätte und nicht solche elend Langen DataSections die ich sowieso nicht verstehe.

Liebe Grüße,
NathanielBlack

Re: 3D Versuche: Würfel + Textur

Verfasst: 19.06.2010 19:26
von Fluid Byte
Kann mir jemand die benötigten Sachen für einen Würfel geben? Das wäre echt nett:)
Was du brauchst ist ein Model-Editor, keinen Babysitter der dir alles abnimmt.

Besorg dir DeleD 3D und auf gehts. Das ist der einfachste, feature-reichste Editor den du finden wirst und kostenlos noch dazu.

Außerdem gibt's ein integriertes Plugin womit du ins .mesh-Format konvertieren kannst.
Alles in allem wirklich simpel gestrickt und leicht zu verstehen. Du wirst dich früher oder später sowieso
mit der Materie auseinandersetzen müssen von daher lieber früher als spät.

Re: 3D Versuche: Würfel + Textur

Verfasst: 19.06.2010 19:42
von hörmi
Aus irendeinem Grund, den ich nicht kenne musst du das Terrain zuerst und dann erst die ganzen Entitys erstellen.
Auf der linken Seite ist bei mir der würfel ganz gut zu erkennen

Code: Alles auswählen

#CameraSpeed = 2


Define.f KeyX, KeyY, MouseX, MouseY



If InitEngine3D()
  Add3DArchive("Data", #PB_3DArchive_FileSystem)
  
  InitSprite()
  InitKeyboard()
  InitMouse()
  ExamineDesktops()
  OpenScreen(DesktopWidth(0),DesktopHeight(0),32,"3D Terrain Test")
  
  UsePNGImageDecoder()
  
  ;Terrain erstellen
  CreateMaterial  (0, LoadTexture(0, "Terrain_Texture.jpg"))
  
  AddMaterialLayer(0, LoadTexture(1, "Terrain_Detail.jpg"), #PB_Material_Add)
  
  CreateTerrain("terrain.png", MaterialID(0))
  
  Sun(250,144,474,#Yellow)
  
  ;test bild laden
  Global test1 = LoadSprite(#PB_Any,"test.png")
  
  ;stadt
  tstadt = CreateMesh(#PB_Any,100)
  SetMeshData(tstadt, #PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_Color, ?CubeData2, 8)
  SetMeshData(tstadt, #PB_Mesh_Face, ?CubeDataIndex, 12)
  
  mstadt = CreateMaterial(#PB_Any,LoadTexture(2,"stadt.jpg"))
  Global stadt = CreateEntity(#PB_Any,MeshID(tstadt),MaterialID(mstadt))
  
  
  ;1 Kamera erstellen
  CreateCamera(0, 0, 0, 100, 100)
  CameraLocate(0, 250, 269, 474)
  
  
  
  SkyDome("clouds.jpg",10)
  
  
  CreateWater(0,159,4,101,100,#PB_World_WaterSmooth|#PB_World_WaterHighQuality|#PB_World_WaterCaustics | #PB_World_WaterSun)
  
  
  Repeat
    
    ;Steuerung
    ExamineKeyboard()
    If KeyboardPushed(#PB_Key_Left)
      KeyX = -#CameraSpeed 
    ElseIf KeyboardPushed(#PB_Key_Right)
      KeyX = #CameraSpeed 
    Else
      KeyX = 0
    EndIf
    
    If KeyboardPushed(#PB_Key_Up)
      KeyY = -#CameraSpeed 
    ElseIf KeyboardPushed(#PB_Key_Down)
      KeyY = #CameraSpeed 
    Else
      KeyY = 0
    EndIf
    
    
    
    ExamineMouse()
    MouseX = -(MouseDeltaX()/10)*#CameraSpeed/2
    MouseY = -(MouseDeltaY()/10)*#CameraSpeed/2
    
    
    
    
    
    
    CameraLocate(0,CameraX(0),Height,CameraZ(0))
    MoveCamera  (0, KeyX, -CameraY(0)+50, KeyY)
    
    RenderWorld()
    DisplaySprite(test1,0,0)
    StartDrawing(SpriteOutput(test1))
    Box(0,0,SpriteWidth(test1),SpriteHeight(test1),#Green)
    DrawText(0,0,"Camera X = "+Str(CameraX(0)),#Red)
    DrawText(0,20,"Camer Y = "+Str(CameraY(0)),#Red)
    DrawText(0,40,"Camera Z = "+Str(CameraZ(0)),#Red)
    StopDrawing()
    
    FlipBuffers()
  Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  
EndIf
End



#SQRT13 = 0.57735026
DataSection
  CubeData2:
  
  Data.f -100.0,100.0,-100.0        ; 0 position
  Data.f -#SQRT13,#SQRT13,-#SQRT13  ; 0 normal
  Data.l 255                        ; 0 colour
  Data.f 100.0,100.0,-100.0         ; 1 position
  Data.f #SQRT13,#SQRT13,-#SQRT13   ; 1 normal
  Data.l 255                        ; 1 colour
  Data.f 100.0,-100.0,-100.0        ; 2 position
  Data.f #SQRT13,-#SQRT13,-#SQRT13  ; 2 normal
  Data.l 255                        ; 2 colour
  Data.f -100.0,-100.0,-100.0       ; 3 position
  Data.f -#SQRT13,-#SQRT13,-#SQRT13 ; 3 normal
  Data.l 255                        ; 3 colour
  Data.f -100.0,100.0,100.0         ; 4 position
  Data.f -#SQRT13,#SQRT13,#SQRT13   ; 4 normal
  Data.l 255                        ; 4 colour
  Data.f 100.0,100.0,100.0          ; 5 position
  Data.f #SQRT13,#SQRT13,#SQRT13    ; 5 normal
  Data.l 255                        ; 5 colour
  Data.f 100.0,-100.0,100.0         ; 6 position
  Data.f #SQRT13,-#SQRT13,#SQRT13   ; 6 normal
  Data.l 255                        ; 6 colour
  Data.f -100.0,-100.0,100.0        ; 7 position
  Data.f -#SQRT13,-#SQRT13,#SQRT13  ; 7 normal
  Data.l 255                        ; 7 colour
  
  CubeDataIndex:
  Data.w 0,2,3
  Data.w 0,1,2
  Data.w 1,6,2
  Data.w 1,5,6
  Data.w 4,6,5
  Data.w 4,7,6
  Data.w 0,7,4
  Data.w 0,3,7
  Data.w 0,5,1
  Data.w 0,4,5
  Data.w 2,7,3
  Data.w 2,6,7
  
EndDataSection
edit:
Fluid Byte hat geschrieben: Besorg dir DeleD 3D und auf gehts. Das ist der einfachste, feature-reichste Editor den du finden wirst und kostenlos noch dazu.
Hey, cool werd ich mal testen. Ich hab das bis jetzt immer mit dem mesh converter von ogre selbst mit einem meist nicht zufriedenstellenden ergebniss gemacht

Re: 3D Versuche: Würfel + Textur

Verfasst: 19.06.2010 19:50
von NathanielBlack
Danke euch beiden, dieser riesige Würfel steht nun auf der Map.

Werde mir jetzt mal mit dem empfohlenden Programm eine kleine Stadt basteln (wenns denn wirklich so einfach ist^^)

Re: 3D Versuche: Würfel + Textur

Verfasst: 19.06.2010 20:30
von Fluid Byte
Naja, einfach ist relativ aber schließlich ham' wa' alle mal irgendwann angefangen.

Und obwohl der Spruch platt ist: Übung macht den Meister <)

Re: 3D Versuche: Würfel + Textur

Verfasst: 20.06.2010 13:39
von NathanielBlack
So, ich habe mir jetzt eine Stadt erstellt. (Stadt = Würfel^^)

Sie ist auch an der Position an der sie sein soll. Jetzt will ich nur wissen, warum MousePick bei mir ned funzt. Ich will ja wissen, ob mein Mauszeiger grad auf ner Stadt ist oder nicht und den Stadtnamen dann ausgeben.

Bei mir gibt MousePick einfach immer zurück, dass es auf Wasser oder im Nichts ist. Wenn es im Nichts ist, stimmt die Rückgabe auch, aber wenn ich auf Landmasse bin dann gibt es auch Wasser statt Land zurück -.-
Und über einer Stadt wird auch Wasser zurückgegeben.

Hat jemand ne Idee woran das liegen könnte. Ich habe es vor und nach Render World versucht, aber beides hat nicht geklappt.


Danke im Vorraus,
NathanielBlack

ps. Hat ganz schön lange gedauert, den Würfel (= Stadt) in die richtige größe zu bringen^^

Re: 3D Versuche: Würfel + Textur

Verfasst: 20.06.2010 14:47
von hörmi
Wenn ich die Würfel kleiner mache zeigt es mir die Nämen der Städte auch nicht mehr an.. wohl ein fehler von Ogre.
aber ich mach ogre sowieso nicht

Code: Alles auswählen

#CameraSpeed = 2


Define.f KeyX, KeyY, MouseX, MouseY



If InitEngine3D()
  Add3DArchive("Data", #PB_3DArchive_FileSystem)
  
  InitSprite()
  InitKeyboard()
  InitMouse()
  ExamineDesktops()
  OpenScreen(DesktopWidth(0),DesktopHeight(0),32,"3D Terrain Test")
  
  UsePNGImageDecoder()
  
  ;Terrain erstellen
  CreateMaterial  (0, LoadTexture(0, "Terrain_Texture.jpg"))
  
  AddMaterialLayer(0, LoadTexture(1, "Terrain_Detail.jpg"), #PB_Material_Add)
  
  CreateTerrain("terrain.png", MaterialID(0))
  
  Sun(250,144,474,#Yellow)
  
  ;test bild laden
  Global test1 = LoadSprite(#PB_Any,"test.png")
  
  ;stadt
  tstadt = CreateMesh(#PB_Any,100)
  SetMeshData(tstadt, #PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_Color, ?CubeData2, 8)
  SetMeshData(tstadt, #PB_Mesh_Face, ?CubeDataIndex, 12)
  
  mstadt = CreateMaterial(#PB_Any,LoadTexture(2,"stadt.jpg"))
  Global stadt1 = CreateEntity(#PB_Any,MeshID(tstadt),MaterialID(mstadt))
  Global stadt2 = CreateEntity(#PB_Any,MeshID(tstadt),MaterialID(mstadt))
  Global stadt3 = CreateEntity(#PB_Any,MeshID(tstadt),MaterialID(mstadt))
  ScaleEntity(stadt1,0.08,0.08,0.08)
  ScaleEntity(stadt2,0.08,0.08,0.08)
  ScaleEntity(stadt3,0.08,0.08,0.08)
  MoveEntity(stadt1,274,TerrainHeight(274,341)+27,341)
  MoveEntity(stadt2,348,TerrainHeight(348,436)+27,436)
  MoveEntity(stadt3,491,TerrainHeight(491,304)+27,304)
  ;1 Kamera erstellen
  CreateCamera(0, 0, 0, 100, 100)
  CameraLocate(0, 250, 269, 474)
  
  maus=CreateSprite(-1,5,5)
  
  SkyDome("clouds.jpg",10)
  
  
  CreateWater(0,159,4,101,100,#PB_World_WaterSmooth|#PB_World_WaterHighQuality|#PB_World_WaterCaustics | #PB_World_WaterSun)
  
  
  Repeat
    
    ;Steuerung
    ExamineKeyboard()
    If KeyboardPushed(#PB_Key_Left)
      KeyX = -#CameraSpeed 
    ElseIf KeyboardPushed(#PB_Key_Right)
      KeyX = #CameraSpeed 
    Else
      KeyX = 0
    EndIf
    
    If KeyboardPushed(#PB_Key_Up)
      KeyY = -#CameraSpeed 
    ElseIf KeyboardPushed(#PB_Key_Down)
      KeyY = #CameraSpeed 
    Else
      KeyY = 0
    EndIf
    
    
    
    ExamineMouse()
    MouseX = -(MouseDeltaX()/10)*#CameraSpeed/2
    MouseY = -(MouseDeltaY()/10)*#CameraSpeed/2
    
    
    
    
    
    
    CameraLocate(0,CameraX(0),Height,CameraZ(0))
    MoveCamera  (0, KeyX, -CameraY(0)+50, KeyY)
    
    RenderWorld()
    DisplaySprite(test1,0,0)
    DisplaySprite(maus,MouseX(),MouseY())
    StartDrawing(SpriteOutput(test1))
    Box(0,0,SpriteWidth(test1),SpriteHeight(test1),#Green)
    DrawText(0,0,"Camera X = "+Str(CameraX(0)),#Red)
    DrawText(0,20,"Camer Y = "+Str(CameraY(0)),#Red)
    DrawText(0,40,"Camera Z = "+Str(CameraZ(0)),#Red)
    DrawText(0,60,Str(MousePick(0,MouseX(),MouseY())))
    Select MousePick(0,MouseX(),MouseY())
      Case stadt1
        DrawText(0,80,"London")
      Case stadt2
        DrawText(0,80,"Paris")
      Case stadt3
        DrawText(0,80,"Berlin")
    EndSelect
    
    StopDrawing()
    
    FlipBuffers()
  Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  
EndIf
End



#SQRT13 = 0.57735026
DataSection
  CubeData2:
  
  Data.f -100.0,100.0,-100.0        ; 0 position
  Data.f -#SQRT13,#SQRT13,-#SQRT13  ; 0 normal
  Data.l 255                        ; 0 colour
  Data.f 100.0,100.0,-100.0         ; 1 position
  Data.f #SQRT13,#SQRT13,-#SQRT13   ; 1 normal
  Data.l 255                        ; 1 colour
  Data.f 100.0,-100.0,-100.0        ; 2 position
  Data.f #SQRT13,-#SQRT13,-#SQRT13  ; 2 normal
  Data.l 255                        ; 2 colour
  Data.f -100.0,-100.0,-100.0       ; 3 position
  Data.f -#SQRT13,-#SQRT13,-#SQRT13 ; 3 normal
  Data.l 255                        ; 3 colour
  Data.f -100.0,100.0,100.0         ; 4 position
  Data.f -#SQRT13,#SQRT13,#SQRT13   ; 4 normal
  Data.l 255                        ; 4 colour
  Data.f 100.0,100.0,100.0          ; 5 position
  Data.f #SQRT13,#SQRT13,#SQRT13    ; 5 normal
  Data.l 255                        ; 5 colour
  Data.f 100.0,-100.0,100.0         ; 6 position
  Data.f #SQRT13,-#SQRT13,#SQRT13   ; 6 normal
  Data.l 255                        ; 6 colour
  Data.f -100.0,-100.0,100.0        ; 7 position
  Data.f -#SQRT13,-#SQRT13,#SQRT13  ; 7 normal
  Data.l 255                        ; 7 colour
  
  CubeDataIndex:
  Data.w 0,2,3
  Data.w 0,1,2
  Data.w 1,6,2
  Data.w 1,5,6
  Data.w 4,6,5
  Data.w 4,7,6
  Data.w 0,7,4
  Data.w 0,3,7
  Data.w 0,5,1
  Data.w 0,4,5
  Data.w 2,7,3
  Data.w 2,6,7
  
EndDataSection

Re: 3D Versuche: Würfel + Textur

Verfasst: 20.06.2010 16:55
von NathanielBlack
Sehr nett, hörmi! Danke dir. ( Du kennst dich bald besser im Code aus als ich^^)

Nur leider bringt es mir nichts, wenn ich solche fetten Bolzen als Städte auf der Map habe. Ich will die Städte so groß machen, wie die auf diesen Screen aus (dem sesationellen) Medieval II:
http://www.joergspielt.de/wp-content/up ... ieval2.jpg

Muss ich gleich ne` andere Engine nehmen, oder kann ich das auch irgendwie anders realisieren? Wir macht ihr sowas mit Ogre?

(Bin auf jeden Fall froh, dass der Fehler nicht an mir lag:P)

Danke im Vorraus,
NathanielBlack

edit:
Komisch... ScaleEntity(stadt1,0.02,0.02,0.02) geht auch. Wieso geht es dann bei dir nicht?

edit2:
Nochmal komisch...Mit meinem anderen -"richtigen"- PC gehts auch ned, wenn es so klein ist. Also echt seltsam. Vielleicht liegts an der Bildschirmauflösung. Welche nutzt du?

edit3:
Abermals komisch... "MoveEntity(stadt1,274,TerrainHeight(274,341)+27,341)"...Wenn ich hier die +27 weglasse bzw. zu +17 ändere, sodass das neue kleinere Model nicht mehr in der Luft ist funktioniert es auch nicht mehr -.- Übrigens: TerrainHeight gibt zu diesem Zeitpunkt (wahrscheinlch weil die Welt noch net gerendert ist) 0.00 zurück. Also reicht auch nur die "27" bzw. "17".