Seite 1 von 4

3d game mit 3d brille /°°\

Verfasst: 30.11.2006 18:41
von Brügge
hiho! ich möchte gerne ein 3d spiel mir egal was programmieren. jetzt mache ich da 2 kameras nebeneinander und möchte die aufm bildschirm anzeigen.

1.
ich habe mir überlegt das die eine kamera nur grün und die andere nur rot anzeigt. jetzt habe ich allerdings texturen auf den wänden. wie kann ich eine texture einlesen, das die im sprite nur rot ist also hell und dunkelrot (damit man noch die texture hat) , also nur rottöne.

das ganze auch mit blau oder grün.

2.
Ein normaler bildschirm hat ja auf jeden pixel 3lampen rotgrün und blau. da ich 2bilder haben , die nur rot und nur blau oder grün sind müssen die sich ja von den lampen nicht ändern.

wie mache ich das jetzt, das ich ein sprite aufm bildschirm setze und der nur die rot werte aufm bildschirm ändert. also grün und blau sollen so bleiben.


jaja ich weiß ich kann nicht gut erklären aber ich hoffe ihr habt verstanden was ich meine ^^


thx!!

Verfasst: 30.11.2006 18:54
von AndyX
einfach die einzelnen Farbkanäle ändern, z.B. wenn du mehr Rot willst:

Code: Alles auswählen

;- Farbkanäle extrahieren
r = Red(color)
g = Green(color)
b = Blue(color)

;- nach Belieben ändern
newr = r * 2
newg = g / 2
newb = b / 2

;- zu große Werte "zurechtstutzen"
If newr > 255
  newr = 255
EndIf
If newg > 255
  newg = 255
EndIf
If newb > 255
  newb = 255
EndIf

;- neue Farbe mixen
newcolor = RGB(newr,newg,newb)

Verfasst: 30.11.2006 18:59
von Brügge
thx aber ich glaube ich habe mich falsch ausgedrückt. also: ich habe einen sprite. der nur aus rot werten besteht. also blau und grün sind immer auf 0.

und ich habe ein sprite was nur grün ist also blau und rot sind immer auf 0.

um jetzt das rote bild anzeigen zu lassen, benötige ich also nur die roten lampen aufm bildschirm. allerdings setzt der dann blau und grün auf 0.

sogesehen habe ich in einem bildschirm ja 3 bildschirme rgb aber wenn ich sage pixel (300,300) soll rot sein dann ist der zwar rot aber der alte blauwert ist weg und der grünwert auch.


ich hoffe ihr versteht was ich meine ^^

Verfasst: 30.11.2006 19:06
von AndyX
soll das heißen du willst zwei Farbwerte überblenden? :?

Verfasst: 30.11.2006 19:08
von Brügge
sogesehen ja

also wenn ich ein bild nur rotwerte habe und ein anderes nur blauwerte dann geht das ja

aber wie?

Verfasst: 30.11.2006 19:10
von AndyX
nichts leichter als das, hehe

Code: Alles auswählen

v = 50 ;- Verhältnis, in % von 0 bis 100

;- color1 = Farbe, die schon auf dem Screen ist
;- color2 = Farbe, die du drauf gemixt haben willst

;- Farbkanäle extrahieren
r1 = Red(color1)
g1 = Green(color1)
b1 = Blue(color1)

r2 = Red(color2)
g2 = Green(color2)
b2 = Blue(color2)

;- Mixen
newr = ((r1 * v) / 100) + ((r2 * (100 - v)) / 100)
newg = ((g1 * v) / 100) + ((g2 * (100 - v)) / 100)
newb = ((b1 * v) / 100) + ((b2 * (100 - v)) / 100)

;- neue Farbe mixen
newcolor = RGB(newr,newg,newb) ;- diese Farbe kannste dann auf den Screen geben[quote][/quote]

Verfasst: 30.11.2006 19:16
von Brügge
ähm das programm tutzt hilft mir allerdings nicht viel weiter: (soviel habe ich auch alleine hinbekommen)

Der witz bei der sache ist, ich habe einen sprite und nicht nur 1 pixel. also müsste ich das ganze sprite einscannen und jeden pixel immerwieder anzeigen.(dauert halt zu lange) und weil das eine bilde nur rot ist und das andere nur blau muss ich das doch mit einen ode 2 befehlen so hinbekommen oder? der muss ja nicht rechnen sondern nur auf den rotanteil malen und den blau und grünanteil beibehalten.

Verfasst: 30.11.2006 19:58
von AndyX
die PB-Sprite-Befehle bieten sowas eben nicht an, also musstes dir selber proggen. Wenn du das direkt über den Memory machst, kannste sicher auch Zeit einsparen.

Verfasst: 30.11.2006 22:31
von Bax
Mit Sprite3D könnte man die Sache etwas beschleunigen:

Code: Alles auswählen

InitSprite()
InitSprite3D()
InitKeyboard()
OpenScreen(1280, 1024, 32, "screen")

;- ein rotes Sprite
CreateSprite(0, 128, 128, #PB_Sprite_Texture)
  StartDrawing(SpriteOutput(0))
    Box(0, 0, 128, 128, $00FF00)
  StopDrawing()
  CreateSprite3D(0, 0)

;- ein gruenes Sprite
CreateSprite(1, 128, 128, #PB_Sprite_Texture)
  StartDrawing(SpriteOutput(1))
    Box(0, 0, 128, 128, $0000FF)
  StopDrawing()
  CreateSprite3D(1, 1)

;- Transparenz (0 - vollkommen durchsichtig, 100 - undurchsichtig)
transparency = 50


Repeat
  Delay(1)
  ClearScreen($000000)
  
  Start3D()
    DisplaySprite3D(1, 64, 64)
    If transparency > 0
      DisplaySprite3D(0, 128, 128, 255 / (100/transparency))
    Else
      DisplaySprite3D(0, 128, 128, 0)
    EndIf
  Stop3D()
  
  FlipBuffers()
  ExamineKeyboard()
Until KeyboardReleased(#PB_Key_Escape)
Das Mixen geht dann "automatisch".

Edit: transparency=0 abfragen :oops:

Verfasst: 30.11.2006 22:41
von Brügge
das ist schon fast perfekt aber, jetzt ist die scheisse durchsichtig heißt die wände, die dahintersind sollen ja nicht angezeigt werden, also die anderen roten wände

das darf also nicht transparent sein...