Minimap-Frage!
Übersicht

OetzicoolBetreff: Minimap-Frage! |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Und wieder eine neue Frage von mir ![]() Also folgendes ich habe ne Minimap gebastelt, einfach nur eine 2. Kamera die das Terrain von oben betrachtet! Jetzt will ich das die Kamera die über die Landschaft fliegt z.b. als Punkt auf der Minimap angezeigt wird aber wie mach ich des? Muss ich die Koordinaten der Kamera nehmen und dann auf die Minimap umrechnen also sozusagen über den Bildschirm gemalt oder gibts auch ne andere Möglichkeit? Danke schonmal! Cu Oetzicool |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo Oetzicool, du kannst es so machen, indem du an die Position der ersten Kamera eine kleine Sphere zeichnest. Wenn die Positionen der ersten Kamera und der Sphere gleich sind, wird die Sphere die Sicht der ersten Kamara nicht verhindern, da die Polygone der Sphere von innen herraus nicht sichtbar sind (Ausser "EntityFX Sphere,16" ist eingeschaltet). Wenn du nun mit den Kameras rumfährst dann kannst du mit der zweiten immer sehen wo die erste Kamera ist. | ||
Oetzicool |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ja aber sagen wir ich baue noch ein paar häuser in mein terrain ein! Und will das sie auch auf der Minimap angezeigt werden aber ich will die nicht rotanmalen damit sie auf der Minimap gesehen werden | ||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nagut, ich verstehe das Problem nicht. Weil die Häuser und die Sphere dann weiß sind? Vielleicht geht ja das hier.
Wenn die Camera2 (Minimap) oben auf das Terrain der Camera1 zeigt, dabei die Camera2 X und Z Koordinaten der Camera1 mitverfolgt, dann hat doch die Camera2 immer die Camera1 genau im Mittelpunkt! Oder? Somit kannst du einfach nach RenderWorld/UpdateWorld ein 'roten' Punkt als 2D (per Oval/DrawImage) in die Mitte der Minimap zeichnen und dann Flip... |
||
Oetzicool |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ne also des ist so die kameras sind voneinander unabhängig...d.h. die 2. Kamera verfolgt die erste nicht sie steht nur still über der Map und beobachtet sie und mit der ersten Kann ich über die Map schweben... | ||
Oetzicool |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also ich habe mal deine Idee mit dem Sphere versucht aber sie wird nicht angezeigt hier ist der code vieleicht findest du den fehler:
BlitzBasic: [AUSKLAPPEN]
|
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ok jetzt kappier ich es... Falls du möchtest das die Camera2 zwar still steht, aber mitschwenken soll, dann mach AlignToVector mit der Camera2. Falls sie sich garnicht bewegen soll, dann kommst du meiner Meinung nach ohne kleine Umrechnungensformeln nicht rum. Du hast aber Glück, daß die 3D-Grafikkarten eigentlich kein richtiges 3D Berechnen (sondern son billigen abklatsch davon) welches zumal für dieses Beispiel es etwas einfacher macht. Wenn Camera2 genau 90° zu den Achsen der Map steht, dann kannst du die X und Z Position der Camera1 in die Minimap in form X und Y als 2D per Skallierung umrechnen. Wegen den billigen abklatsch reicht es die 3D X/Z Koordinaten in 2D X/Y einfach zu Skallieren. Denn richtigen Faktor musst du dann durch Annäherungen herrausfinden, oder rechnest dir das mal mit dem Taschenrechner aus. | ||
Oetzicool |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ok alles klar ich werds mal versuchen aber hast du rausgefunden was an meinem code falsch war | ||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Habe dein Code mal ausprobiert. Schönes ding. Hier mal meine Antwort... Mach mal <ScaleEntity sphere,60,60,60,1> dann klappts auch... 60 ist vielleicht ein bischen zuviel, aber es funzt. | ||
Oetzicool |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
also hab rumgetüfftelt und ne formel gemacht aber irgenwie funzt es nicht so ganz die block bewegt sich zwar in die richtung aber viel zu langsam wenn ich am ende der karte bin ist der block noch nichtmal in der mitte der Minimap!
Hier der Code: BlitzBasic: [AUSKLAPPEN]
|
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hast du mein Beispiel vorhin mal ausprobiert? Falls du es denoch auf 2D machen möchtest, musst du den Wert ausrechnen oder durch Annäherung ermitteln. Ich finde aber das die Sphere ganz Okay aussieht. Problem bei der 2D-Methode ist, daß immer wenn du was änderst (zB. ScaleEntity Terrain, Gesammtgröße Terrain, Sichtbare größe Minimap) du die Werte für die Umrechnung umändern musst. Eine Idee hätte ich da noch, falls dir beide nicht zusagen...
Nehmen wir an die Map währe 1000 Einheiten breit und 1000 Einheiten tief. Die Kamera für die Minimap währe zB 1000 Einheiten hoch, also auf Position 500,1000,500. Wenn du dann ein Sprite immer auf mittlerer Höhe (500) stellt, und zwar so das man es nur von oben sieht (Backfaces ausgeschaltet) Dann reicht es die Position des Sprites die hälfte der Position X,Y,Z der Kamera am Boden zu stellen. Wenn Camera1 dann 300,100,730 hat, dann positionierst dann das Sprite auf 1000-(1000-300)/2,1000-(1000-100)/2,1000-(1000-730)/2 = 650,550,865... Somit kann es nicht passieren das, wie bei der Sphere diese von einem Objekt zB einem Haus auf der Minimap verdekt wird, da alle Objekte wohl nicht mal halb so hoch sein werden wie die Map groß ist. Das Sprite stört nicht in der 3D-Welt, falls Multiplayer integriert werde sollen. Ich kann dir mal ein beispiel proggen... mom. |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
So jetzt hab ich mal ein Beispielcode dafür... Deine Map ist 12800 Einheiten breit und 12800 Einheiten tief. Wenn die Cam2 auf höhe 6400 gesetzt wird, dann hat mal alles GENAU im Blickfeld (da die Kameras +/- 45° einfangen). Ich habe ein Sprite gestellt welches im Verhältnis 9/10 Höhe positioniert wird. Mapmitte ist X=6400, Z=6400. Wegen des Verhältnisses zu 10 ist dadurch die Spritehöhe auf 5760 (Cam2 Y=6400-(6400/10) festgelegt. Egal wo du mit der Kamera hinfährst, das Sprite stellt die Position im Viewport richtig an. Bedingt durch die Spritehöhe ist es äusserst unwahrscheinlich das Gebäude oder andere Gegenstände überhaupt diese Hähe erreichen können, welche es verdecken könnten. Hier der Code...
Code: [AUSKLAPPEN] Graphics3D 640,480,32,2
AppTitle "3D Test" ;SetBuffer BackBuffer() ;Variablen deklarieren Global wellenhoehe# = 10 Global minimap_x=3210 Global minimap_y=3200 Global minimap_z=3205 Global camera_x=6400 Global camera_y=400 Global camera_z=6400 ;Daten Laden (Terrain,Texturen) ;########SPRITE#LADEN######## PSprite=CreateSprite() TSprite=LoadTexture("data\moss.bmp",1) EntityTexture PSprite,TSprite SpriteViewMode PSprite,2 RotateEntity PSprite,90,0,0 ScaleSprite PSprite,20,20 ;########SPRITE#LADEN######## terrain=LoadTerrain("data\hm2.bmp") text1=LoadTexture("data\moss.bmp") text2=LoadTexture("data\tx1.bmp") text3=LoadTexture("data\wood_b.tga") ;Geladene Daten anpassen EntityTexture terrain,text1,0,0 EntityTexture terrain,text2,0,1 ScaleEntity terrain,50,290,50 ScaleTexture text1, 50,50 ScaleTexture text2, 3,3 TerrainDetail terrain,5000,1 ;Wasser erstellen water=CreatePlane() watertext=LoadTexture("data\hm1.bmp",4) EntityTexture water,watertext ScaleTexture watertext,20,20 MoveEntity water,0,100,0 EntityAlpha water,0.5 ;Kameras initialisieren cam=CreateCamera() cam2=CreateCamera() PositionEntity cam2,6400,6400,6400;########MITTE#MAP######## RotateEntity cam2,90,0,0,1;########HIERHER#VERSCHOBEN######## CameraFogMode cam,1 CameraRange cam,1,30000 CameraRange cam2,1,30000 ;Licht initialisieren light=CreateLight() TurnEntity light,45,45,0 ;Programmschleife starten While Not KeyHit(1) ;Richtung ändern If KeyDown(205) Then yaw#=yaw#-1 If KeyDown(203) Then yaw#=yaw#+1 If KeyDown(200) Then pitch#=pitch#-1 If KeyDown(208) Then pitch#=pitch#+1 RotateEntity cam,pitch#,yaw#,0,0 If KeyDown(75) Then camera_x=camera_x-5 If KeyDown(77) Then camera_x=camera_x+5 If KeyDown(72) Then camera_y=camera_y-5 If KeyDown(80) Then camera_y=camera_y+5 If KeyDown(78) Then camera_z=camera_z-5 If KeyDown(156) Then camera_z=camera_z+5 PositionEntity cam,camera_x,camera_y,camera_z ;########SPRITE#ZEICHNEN######## PositionEntity PSprite,6400-(6400-camera_x)/10,5760,6400-(6400-camera_z)/10 ;########SPRITE#ZEICHNEN######## ;Minimap initialisieren und einstellen CameraViewport cam2,25,300,150,150 ;Unterwasser If EntityY(cam) < EntityY(water) Then CameraFogRange cam,50,200 CameraFogColor cam,1,75,150 CameraClsColor cam,1,75,150 EndIf If EntityY(cam) > EntityY(water) Then CameraFogRange cam,100,4000 CameraFogColor cam,40,140,255 CameraClsColor cam,40,140,255 EndIf ;Kamerageschwindigkeit MoveEntity cam,0,0,2 ;Kollision <--------------------NICHT BEACHTEN FUNKTIONIERT NICHT EntityType cam,1 EntityType terrain,1 EntityRadius cam,1 EntityRadius terrain,1 Collisions 1,2,2,2 RenderWorld ;Infodaten Text 20,20, "Yaw:"+yaw# Text 20,40, "Pitch:"+pitch# Text 20,60, "Kamera Koordinaten:" Text 20,80, "X:"+camera_x Text 20,100, "Y:"+camera_y Text 20,120, "Z:"+camera_z Flip Wend ClearWorld End [EDIT] Sorry, musst dir deine Dateinamen wieder eintragen... |
||
Oetzicool |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ok also hab auch weiter am Code getüfftelt ist zwar nicht 100% auf den selben Koordinaten wie die Cam aber passt im Grunde auch!
Kannst ja mal ausprobieren werd deinst auch gleich mal testen: BlitzBasic: [AUSKLAPPEN]
|
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenigstens antwortest du, nichts ist nerviger als wenn man sich um die Probleme anderer bemüht und dann keine Antwort bekommt ob man denen helfen konnte oder nicht.
[EDIT]Dein Code ist nicht schlecht. Die Cam2 zeigt aber nicht die ganze Map an! Ich kann also aus dem Cam2-Bereich raus obwohl die Map (Cam1) noch weiteres Terrain darstellt. Positioniere die Cam2 auf Mitte X und Z des Terrains und auf die hälfte der Höhe wie dein Terrain breit bzw. tief ist (+/- 45° Blick)... Ansonsten würde ich ein Sprite in der 3D-Welt bevorzugen, da es meiner Meinung nach einfacher zu handhaben ist... Sorry, wegen des späteren Vorschlags ![]() |
||
- Zuletzt bearbeitet von hectic am So, Sep 04, 2005 18:00, insgesamt einmal bearbeitet
Oetzicool |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
klar ich bin dafür dankbar
also ich habe deine methode probiert aber bei mir kam immer der fehler das die Textur des Sprites nicht gefunden werden konnte obwohl ich alles korrekt eingegeben habe! Kannst du mir vieleicht noch bei anderen Sachen helfen oder zumindest sagen wo ich dazu beiträge finde oder tutorials hab schon überall gesucht: - Wenn man außerhalb der Map geht das man stehen bleibt also nicht mehr weiterlaufen kann - Kollision zwischen Kamera und Terrain (nicht das ich einfach durchlaufen kann - Rich)tiges wasser a(lso wellenbewegungen oder so) - Ein Himmer (vieleicht mit Sonne die auf das Terrain strahlt) Danke schonmal |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
1.) Ausserhalb der Map kannst du mit der If-Anweisung machen. beispiel:Code: [AUSKLAPPEN] If camera_x>12800 then camera_x=12800
oderCode: [AUSKLAPPEN] If camera_z>12800 then camera_z=12800 If camera_x<0 then camera_x=0 If camera_z<0 then camera_z=0 If camera_x>12800 or camera_z>12800 or camera_x<0 or camera_z<0 then (alle Bewegungen stopen und einen Schritt zurrück (sonst kommt man da nicht mehr raus))
2.) Beispiel:Code: [AUSKLAPPEN] If camera_y < TerrainY(terrain,camera_x,camera_y,camera_z)+2 then camera_y = TerrainY(terrain,camera_x,camera_y,camera_z)+2
3.) Mit ModifyTerrain. Du kannst dazu aber Plane nehmen (ist ja flach!). Du must dann ein zweites Terrain erstellen und die Wellenbewegungen mit Sin/Cos machen. Ist aber nicht sonderlich schnell. Solltest also auf jeden Fall die Sin- und Cos-Tabelle vorher in ein Array ablegen (äusserste Präzision ist hier nicht erforderlich (0-360° in einzelschritten reicht hier völlig)). Beispiel:Code: [AUSKLAPPEN] wellen=wellen+1
for y=0 to 254 for x=0 to 254 modifyTerrain Wasserterrain,x,y,sin(wellen+x*10)*cos(wellen+y*10)*2,1 next next 4.) Gute Effekte erreichst du schon mit...Code: [AUSKLAPPEN] AmbientCollor 96,96,96 ;Umgebungslicht eindämmen
LightCollor light,255,255,212 ;Richtungslich leicht gelblich TurnEntity light,70,0,0 ;statdessen Richtungslicht Ich hab jetzt die Werte nicht überprüft. Können also Fehler vorhanden sein. Habe Besuch, kann also heute nicht mehr weiter machen. Werde dir mal ein Beispiel zusenden was ich schon mal gemacht habe... Morgen aber. |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hier ein Beispiel für Wasserbewegung in 3D...
Code: [AUSKLAPPEN] Graphics3D 800,600,32,2
SetBuffer BackBuffer() ;Umgebung schaffen cam=CreateCamera() lig=CreateLight() RotateEntity lig,70,0,0 PositionEntity cam,16,4,0 ;Terrain erstellen terrain=CreateTerrain(32) TerrainDetail terrain,2000,True texture=LoadTexture("data\tx1.bmp") EntityTexture terrain,texture ScaleEntity terrain,1,1,1 While Not KeyHit(1) If KeyDown(203) Then TurnEntity cam,0,+1,0 If KeyDown(205) Then TurnEntity cam,0,-1,0 If KeyDown(200) Then MoveEntity cam,0,0,+.1 If KeyDown(208) Then MoveEntity cam,0,0,-.1 wl#=wl+1 For y#=1 To 31 For x#=1 To 31 ModifyTerrain terrain,x,y,0.5+Sin(wl+(x*10)+(y*10))*0.5 Next Next RenderWorld Flip Wend End |
||
Oetzicool |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Und wie kriege ich des problemlos in meinen Code eingebaut?
Wenn ich es versuche wird kein Wasser angezeigt! |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo Oetzicool, du hast bereits ein Terrain namens terrain, du mußt daher dem 'Wasser'terrain ein anderen Namen geben... | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group