Main Menu
Menu

Show posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Show posts Menu

Messages - Marlon

#46
Danke für das Beispiel! :O)
Mit einer Textur (spotlight) wird dieser Effekt also erzeugt!
Ich habe es mal versucht auf mein Programm anzuwenden, habe es jedoch noch nicht geschafft.
Aber ich werde mich später noch damit beschäftigen, sobald ich die anderen Sachen abgeschlossen habe.

Eine wichtige Frage noch: Wie entferne ich ein Light? World bietet lediglich removeAllLights() an, da müsste ich dann nochmal alle Lichter hinzufügen, die nicht gelöscht werden sollen, ziemlich unhandlich. Ausserdem gibt es ja eine Grenze für Lichter, die ist schnell erschöpft, wenn man einige Lichter hinzufügt und wieder entfernt. Desshalb bringt mich Light.disable() auch nicht wirklich weiter. Irgendwelche Tipps?

Viele Grüsse,
Marlon
#47
Wow super! Mich würde echt brennend der Quellcode interessieren. Könntest du mir den irgendwie schicken, bzw. die Änderungen hier posten?

Noch eine Frage, die mich zur Zeit ziemlich beschäftigt (sorry für Offtopic): Ist es möglich, die Koordinate des tiefsten Punkts eines Meshs zu erhalten?
Mir geht es darum, Objekte auf einer Ebene zu positionieren und mit der Methode, die bei der Cardemo angewendet wird komme ich nicht weiter, da die Objekte nicht unbedingt wie Reifen immer ihren tiefsten Punkt in der Mitte haben.
#48
Alles klar, das gibt ein wenig Aufschluss! :)
Ich bin eigentlich auch zufrieden mit der Waldbeleuchtung. Bloss kann ich mir auch vorstellen, dass es Waldszenen gibt, die weniger beleuchtet sind, dafür das Licht vom Charakter eine gewisse Atmosphäre schafft. Auch in Höhlen stelle ich mir sowas vor. Aber eventuell kann ich das erreichen, indem ich ein halbtransparentes png darüber lege. Dürfte nur beim Zoom etwas blöd aussehen :/.
Aber ich denke, das kann man später noch perfektionieren, das sollte für eine erste Version erstmal reichen. Kleine Schritte gehen, um zum grossen Ziel zu gelangen...
Und das mit der Rotation der Lichtquellen löst nach deiner Erklärung nun endlich meine Verwirrung. Ich dachte, dass sich rotate() beim Licht genauso verhält wie bei den Objekten (wegen dem Namen). Aber um so besser wenn es nicht so ist. Ich persönlich werde das auch nicht brauchen und so bleibt dann auch alles überschaubarer! ::)
#49
Ich habe wie versprochen mittlerweile meinen letzten Post editiert und die Screenshots hinzugefügt. Ich hoffe dass diese das Problem ein wenig verdeutlichen.
Ausserdem habe ich noch ein wenig weitergebastelt und stelle hier einen aktuellen Screenshot zur Verfügung:
#50
Danke für das Programm!

Tatsächlich wird dort ein schöner Lichtradius angezeigt, wenn man world.setAmbientLight(0, 0, 0) setzt.
Auch verdeutlicht das Programm sehr gut das Phenomen, das auftritt, wenn die Polygonanzahl der Plane zu gering ist.
Genau das war mein Problem. Habe das jetzt bei meinem Programm angepasst und es schaut besser aus! :)

Allerdings ist das Problem mit dem Lichtradius dadurch bei meinem Programm nicht behoben. Ich habe alle Lichtquellen ausgeschaltet zum Test, danach war der gesamte Bildschirm schwarz, beziehungsweise nur noch das Menuobjekt zu sehen.
Danach habe ich das Licht eingeschaltet, welches an den Charakter gebunden wird:


        characterlight = new Light(world);
        characterlight.setIntensity(255, 255, 255);
        characterlight.setAttenuation(200);


Dieses wird bei jedem Loop aktualisiert:

        SimpleVector vec = character.getTransformedCenter();
        vec=new SimpleVector(vec.x, vec.y-40, vec.z);
        characterlight.setPosition(vec);


Leider wird dabei die komplette Landschaft erhellt. Im Hintergrund ist die Lichtintesität zwar nicht so stark, trotzdem bekommt man nicht den Eindruck vermittelt, der Charakter würde eine Fackel mit sich tragen und nur die 2 Meter um sich herum erhellen. Komischerweise tritt das nur bei der Plane und den Bäumen auf, das Feuer ist tatsächlich nicht mehr sichtbar, wenn der Charakter sich zu weit davon entfernt.
Auf dem ersten angehangenen Bild ist das hoffentlich recht gut zu erkennen.

--------------------------------------------------------

Füge ich nun folgendes ein...


        characterlight.setDiscardDistance(75f);


...wird die Plane komplett unsichtbar, wenn man 3 Schritte gelaufen ist. Die Bäume werden dann entweder ganz sichtbar oder sind überhaupt nicht zu sehen, man hat nicht das Gefühl das sie langsam vom Lichtradius erfasst werden, wenn der Charakter sich ihnen nähert. Ich hoffe das zweite Bild verdeutlicht diese Problematik recht deutlich.

---------------------------------------------------------

Und nun nochwas zur Ausrichtung des Lichts. Dass das Licht nach allen Seiten hin ausgebreitet wird stimmt nicht so ganz. Wenn ich mittels light.rotate(vector1, vector2) das Licht rotiere, so wird die Lichtintensität in manchen Bereichen grösser. Ich habe das getestet. Zwar wird alles ausgeleuchtet, aber nicht gleichermassen. Möchte man jedoch, dass das Licht zu allen Seiten hin gleichermassen ausgesendet wird, lässt man light.rotate(vector1, vector2) am besten unangetastet? In welche Richtung zeigt denn dann das Licht standartmässig, nach oben oder nach unten?

P.S.: Ups.. ich habe gerade gesehen, dass man gar keine Attachments anfügen kann. Ich werde das dann später von zu Hause aus machen und hier editieren. Ich kann dir die Screenshots aber auch gerne per Mail zukommen lassen wenn du magst, Egon. Schick mir in diesem Fall doch einfach ne PM. Danke!

Edit: So hier die versprochenen Screenshots:

#51
German corner / Re: Schattentransparenz
November 10, 2011, 10:35:20 AM
Ah, alles klar. Ich werde versuchen einen Mittelweg zu finden.
Bei meinem isometrischen Rollenspiel macht sich das Problem nicht wirklich dramatisch bemerkbar, allerdings frage ich mich wie man es lösen würde, wenn man ein Rollenspiel aus der dritten Perspektive oder gar einen FPS realisieren möchte...
#52
Ah, alles klar, danke für die Hilfe! :)

Nochmal zum ersten Problem: Ich habe mit setAdditionalColor() gearbeitet. Allerdings färbt sich das ganze Object mit der zusätzlichen Farbe, was nicht erwünscht ist, da transparente Teile des Bildes auf der Plane nicht zu sehen sein sollen.

Zu Punkt 2: Ja, ich habe auch überlegt die Anzahl der Polygone der Plane zu erhöhen, allerdings würde die Anzahl ja exponentiell steigen und bei 100X100 bereits 10000 betragen. Aber ich bin mir sicher, es lässt sich hier ein akzeptabler Mittelweg finden. Weisst du eigentlich wie viele Polygone (Faces) bei einer durchschnittlichern Grafikkarte und Rechenleistung bei 25 FPS angezeigt werden können?

Nochmal zu dem Problem mit dem Lichtradius. Es scheint wohl nicht möglich zu sein, aus einem Licht einen klassischen Lichtradius (finstere Höhle, nur ein kleiner Bereich um den Charakter ist sichtbar) zu machen.  light.setDiscardDistance() und light.setAttenuation() liefern hier leider nicht das gewünscht Ergebnis.
Gibt es hier Möglichkeiten, von denen ich noch nicht weiss?
Und wohin zeigt der Lichtkegel eigentlich standartmässig?
#53
Ich habe mich noch länger mit dem Lighting System befasst.

Ich erstelle eine Ebene...

        plane = Primitives.getPlane(20, 120);
        plane.rotateX(PI / 2f);
        plane.rotateMesh();
        plane.setRotationMatrix(new Matrix());
        plane.setTexture("grass");
        plane.setCollisionMode(Object3D.COLLISION_CHECK_OTHERS);
        plane.setCollisionOptimization(Object3D.COLLISION_DETECTION_OPTIMIZED);
        tileTexture(plane, 16);


...und ein Licht, welches vom Spieler "getragen" (oberhalb des Kopfes positioniert) werden soll.

        characterlight = new Light(world);
        characterlight.setIntensity(196, 180, 150);
        characterlight.setAttenuation(256);


Dieses Licht wird nach jeder Bewegung aktualisiert:

        SimpleVector vec = character.getTransformedCenter();
        vec=new SimpleVector(vec.x, vec.y-40, vec.z);
        characterlight.setPosition(vec);


Seltsamerweise wird die Ebene bei Bewegung des Charakters in gleichmässigen Abständen bei einigen Stellen mehr und bei anderen Stellen weniger beleuchtet.
Ich habe schon versucht, das Licht zu rotieren, das hat das Problem jedoch nicht lösen können (ausserdem sollte das Licht ja standartmässig korrekt rotiert sein, sprich es zeigt auf den Charakter. Ich hoffe das stimmt.).

Desweiteren scheint es nicht möglich zu sein, aus einem Licht einen klassischen Lichtradius (finstere Höhle, nur ein kleiner Bereich um den Charakter ist sichtbar) zu machen.  light.setDiscardDistance() und light.setAttenuation() liefern hier leider nicht das gewünscht Ergebnis.
Gibt es hier Möglichkeiten, von denen ich noch nicht weiss?

Ich würde mich sehr auf eine Antwort freuen! :)

P.S.: Ich werde die Tage ein komplexes Beispiel zur Verfügung stellen, welches die JPCT-Grundlagen zur Erstellung eines isometrischen Rollenspiels näherbringen sollte.
#54
Mittels setLighting() kann bei einer Instanz der Klasse Object3D festgelegt werden, ob sie von Lichtquellen beeinflusst werden soll oder nicht. Dabei spielt AmbientLighting keine Rolle.
Reduziere ich AmbientLighting nun auf ein Minimum (um beispielsweise eine dunkle Waldszene darzustellen), so sind Objekte, die durch Licht nicht beeinflusst werden sollen kaum noch sichtbar.

Dieses Problem äussert sich bei mir bei der Darstellung von Partikeln, genauer gesagt planen Ebenen, die eine Feuertextur besitzen und nicht durch das eigene Licht (alle Partikel zusammen ergeben ein Feuer, welches ein Licht ausstrahlt) bestrahlt werden sollen. Stelle ich ein, dass diese nicht durch Licht beeinflusst werden sollen, so sind sie kaum sichbar, im anderen Fall sind die Partikel viel zu hell und kaum als Feuer zu erkennen.
Ist es möglich, dass ein Objekt nur auf manche Lichtquellen reagiert oder gibt es eine andere Möglichkeit dieses Problem zu bewältigen?
#55
German corner / Schattentransparenz
November 08, 2011, 12:52:24 PM
Mittels setAmbientLight() kann dem ShadowHelper eine Helligkeitsstufe des Schattens zugewiesen werden.
Dabei beobachte ich das Phenomen dass besser beleuchtete Objekte in der Mitte des Bildschirms einen dunkleren Schatten werfen als Objekte im Hintergrund, die teilweise einen helleren Schatten werfen, als der Boden, auf dem sie stehen.

Nun sollte der Schatten, den ein Objekt wirft immer dunkler sein als der Untergrund, auf dem er projeziert wird.
Setze ich mittels setAmbientLight() das Licht herab, so dass dass der Schatten nicht zu hell ist, so ist er bei den besser beleichteten Objekten viel zu dunkel.

Gibt es eventuell eine Möglichkeit, dem geworfenen Schatten eine Transparenz einzuverleiben? Oder gibt es eine andere Möglichkeit (eventuell nur mit zusätzlichem ShadowHelper) das Problem zu lösen?
#56
Wow, super, danke für deine Mühe!  :)
Habe das Beispiel bei mir angetestet und es läuft mit 22 FPS.

Die GUI würde sich allerdings immer dann ändern, wenn man ein Fenster schliesst/öffnet, Gegenstände im Rucksack verschiebt, Kontextmenues öffnet, etc...
Ich habe dein Programm mal so umgeschrieben, dass mein Menubild 1024 * 768 darüber gelegt wird. Das sieht tatsächlich nicht verkehrt aus, allerdings läuft es mit 6 FPS wenn man das Bild nach jedem Rechenschritt neu setzt (-> blitTexture.applyEffect()). Verzichtet man auf diesen Auftruf läuft das Programm konstant mit 150 FPS.

Hier mein Code:


import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

import org.lwjgl.opengl.Display;

import com.threed.jpct.FrameBuffer;
import com.threed.jpct.IRenderer;
import com.threed.jpct.ITextureEffect;
import com.threed.jpct.Object3D;
import com.threed.jpct.Primitives;
import com.threed.jpct.SimpleVector;
import com.threed.jpct.Texture;
import com.threed.jpct.World;
import com.threed.jpct.util.Light;

public class BlitExample {
private BufferedImage defimage;

public static void main(String[] args) {
new BlitExample().doIt();
}

private void doIt() {
FrameBuffer buffer = new FrameBuffer(1024, 768, FrameBuffer.SAMPLINGMODE_HARDWARE_ONLY);
buffer.disableRenderer(IRenderer.RENDERER_SOFTWARE);
buffer.enableRenderer(IRenderer.RENDERER_OPENGL);
World world = new World();
Object3D cube = Primitives.getCube(10);
cube.translate(0, 0, 50);
Light light = new Light(world);
light.setIntensity(255, 0, 0);
light.setPosition(new SimpleVector(-100, 0, 0));
world.addObject(cube);
world.buildAllObjects();

BufferedImage image = new BufferedImage(1024, 768, BufferedImage.TYPE_INT_ARGB);
final int[] pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData();
try {
    defimage = ImageIO.read(new File("example/menu.png"));
} catch (IOException e) {
}

Texture blitTexture = new Texture(1024, 1024);
blitTexture.setEffect(new ITextureEffect() {

@Override
public void init(Texture tex) {
// TODO Auto-generated method stub
}

@Override
public void apply(int[] dest, int[] source) {
System.arraycopy(pixels, 0, dest, 0, pixels.length);
}

@Override
public boolean containsAlpha() {
return true;
}
});

long time = System.currentTimeMillis();
int fps = 0;

while (!Display.isCloseRequested()) {
cube.rotateY(0.01f);
buffer.clear();
world.renderScene(buffer);
world.draw(buffer);
updateAndBlit(buffer, image, blitTexture);
buffer.update();
buffer.displayGLOnly();
fps++;

if (System.currentTimeMillis() - time >= 1000) {
System.out.println(fps + "fps");
fps = 0;
time = System.currentTimeMillis();
}
}
}

private void updateAndBlit(FrameBuffer buffer, BufferedImage image, Texture blitTexture) {

Graphics2D g = image.createGraphics();
g.drawImage(defimage, 0, 0, 1024, 768, 0, 0, 1024, 768, null, null);
g.dispose();

blitTexture.applyEffect();
buffer.blit(blitTexture, 0, 0, 0, 0, 1024, 768, buffer.getOutputWidth(), buffer.getOutputHeight(), 15, false, null);
}

}



Ich müsste also jedes Menuelement einzeln blitten, dann sollte es (hoffentlich) klappen.
So, werde jetzt mal ins Wochenende verschwinden und mich dann später nochmal genauer damit befassen und einige Tests machen.
Schönes WE und bis dann!
#57
Ich glaube, dass ich hier irgendwie grundlegend was falsch mache.
Ich habe einfachheits halber erstmal versucht, lediglich eine statische Textur zu laden und über die 3D Welt zu legen.
Unglücklicherweise scheitere ich bereits daran :(
Die Textur ist 1024*768 gross, genau wie das Fenster, welches die 3D Welt beinhaltet.
Nach den buffer.update(); buffer.displayGLOnly() Methoden habe ich also folgende Zeilen eingefügt:


Texture texture=TextureManager.getInstance().getTexture("menu");
buffer.blit(texture, 0, 0, 0, 0, 1024, 768, true);
buffer.display(null);


Das Resultat ist ein flackerndes Bild, was ausserdem 3 Mal in der Höhe übereinandergestapelt und total verzerrt ist.

Wünschenswert wäre ein Bild wie dieses hier, welches die 3D Szene im Hintergrund und das 2D Menu (am besten ein BufferedImage, welches mit Java2D dynamisch zur Laufzeit beschrieben werden kann) im Vordergrund hat:


Falls du irgendeinen Beispielcode für den ITextureEffect parat hättest, oder mir verraten kannst was ich falsch mache, wäre ich dir echt sehr dankbar!
Ich meine irgendeine Lösung für dieses Problem müsste es doch geben...

Danke auf jedenfall für deine Hilfsbereichtschaft und deine schnellen Antworten! :)
#58
Entweder habe ich mich nicht gut ausdrücken können oder befinde mich irgendwie im falschen Film (passiert mir irgendwie öfters).

Die erste Demo der verlinkten Seite malt tatsächlich auf der Graphics Komponente des Applets, beim 2. werden im Vorfeld geladene Texturen an die einzelnen Polygone des Objekts geklebt.
ITextureEffect bringt mich im Moment leider wirklich nicht weiter, Referenzen suche ich vergebens. :(

Ich erinnere mich aber, wie ich damals (vor rund 10 Monaten) für ein Projekt meines Arbeitsgebers versucht hatte das Bild einer Webcam im Hintergrund einer 3D Szene darzustellen (Stichpunkt: Augmented Reality).
Mit einem Kollegen habe ich dann geschraubt und gewerkelt, leider hat das aber nicht funktionert, das Blitting und Texturieren hat einfach zu viel Rechenzeit verschlungen. Wir sind dann zwangsläufig auf C# und XNA umgestiegen.  :-\
Ich muss mich also damit abfinden, dass dynamische Bilder über OPENGL nicht darstellbar sind.

Ich denke ich habe aber eine Möglichkeit gefunden, das Problem trotz allem zu bewältigen.
Die einzelnen Menugrafiken sind natürlich statisch (Kontextmenu mit Text, Buttons, Fenster, Bilder, usw...). Wenn ich nun anstatt alle Einzelelemente in Bufferedimages zu laden um diese zu einem bildschirmgrossen Bild zusammenzufügen, diese dem Texturmanager übergebe, kann ich diese nun einzeln rendern.

Leider birgt dies viel Arbeit und Neuaufwand, sollte aber dann hoffentlich performant und fehlerfrei laufen...
So, erstmal schönes Wochenende und danke nochmal!  :-X
#59
Alles klar, ich danke dir!
Ich werde mich nochmal intensiv mit dem Code auseinandersetzen und schauen, was sich realisieren lässt.
Der ITextureEffect ist mir tatsächlich neu.
#60
Mhhh... habe mir die Demos angeschaut und den Sourcecode downgeloaded. Hierbei wird jedoch von JApplet, bzw. JFrame abgeleitet, so dass die grafische Komponente zur Verfügung steht und ganz bequem darauf gezeichnet werden kann. So habe ich das damals auch testweise mal gemacht, das hat auch alles wunderbar funktioniert.

Da ich nun aber versuche mein Projekt als OPENGL Projekt zu realisieren, brauche ich eine andere Lösung, da ich kein JApplet, bzw. JFrame zur Verfügung stehen habe.
Ausserdem ist das ziemlich inperformant 40 mal in der Sekunde eine neue Textur anzulegen und mit einem Bild zu füllen.

Leider bin ich noch relativ grün hinter den Ohren was die ganze 3D Entwicklung anbetrifft, evtl. denke ich hier in eine völlig falsche Richtung.
Aber andere Spieleentwickler müssen es ja auch irgendwie hinbekommen, ein 2D - Menu über die 3D Spielwelt zu legen sollte ja keine aussergewöhnliche, nur schwer zu bezwingbare Disziplin darstellen.

Mein 2D Spiel, welches online im Netz gespielt werden kann besitzt ein solches Menu: http://www.forgottenelements.com/images/screenshots/pic2.jpg
Es handelt sich also um eine dynamische Fläche, die alle grafischen Menuelemente beinhaltet. Diese soll am Ende gezeichnet werden (also über der Spielwelt liegen).

Falls noch irgendjemand Tipps, Links, Ideen oder sogar Quellcode hat, immer her damit. :)