# java 3d ohne Java3d



## Chloroplast (9. Mrz 2012)

ich hoffe ich bin hier richtig. und zwar bin ich gerade dabei ein 3D-anzeigeprogramm zu basteln. bevor jetzt jmd. auf java 3d verweisst - ich habe es mir bereits angesehen, aber ich möchte gerne eine version machen, die funktioniert ohne DAS der user etw installieren muss (natürlich außer java). mein problem ist, dass das alles so nicht hinkommen kann. 


```
/**
 * @(#)ddhandlertest.java
 *
 * ddhandlertest Applet application
 *
 * @author Chloroplast
 * @version 1.00 2012/3/8
 */

import java.awt.*;
import java.awt.Color.*;
import java.applet.*;
import java.awt.event.*;

public class ddhandlertest extends Applet implements AdjustmentListener{
	int ddobject[][] = new int[13][1];
	int performedDdobject[][];
	int[] newObject = new int[13];
	int allObjects = 1;
	int pointsX[] = new int[4];
	int pointsY[] = new int[4];
	Scrollbar scroll;
	int scrollwert;

	public void init() {
	BorderLayout B = new BorderLayout();
	setLayout(B);

	scroll = new Scrollbar(Scrollbar.HORIZONTAL,360,5,0,720);
	add(scroll,BorderLayout.NORTH);

	scroll.addAdjustmentListener(this);

	initObject();
	}

	//--------------------Eventlistener------------------------------------------------------------------------------

	public void adjustmentValueChanged(AdjustmentEvent e){  //// 3 /////
		scrollwert = e.getValue()-360;
		rotate(scrollwert);
		repaint();}
	//------------------------------------automatische ausführung----------------------------------------------------

	public void rotate(int rot){
		for(int cc=0;cc<allObjects;cc++){
			newObject = turnY(ddobject[1][cc],ddobject[3][cc],ddobject[4][cc], ddobject[6][cc], ddobject[7][cc], ddobject[9][cc], ddobject[10][cc], ddobject[12][cc],rot);

			}
		}

	//------------------------------------Zuweisung von werten--------------------------------------------------------
	public void initObject(){
	ddobject[0][0]=0;
	ddobject[1][0]=60;
	ddobject[2][0]=30;
	ddobject[3][0]=0;//
	ddobject[4][0]=60;
	ddobject[5][0]=-30;
	ddobject[6][0]=0;//
	ddobject[7][0]=-60;
	ddobject[8][0]=-30;
	ddobject[9][0]=0;//
	ddobject[10][0]=-60;
	ddobject[11][0]=30;
	ddobject[12][0]=0;}//


	public void initPolObject(){
		pointsX[0] = newObject[1]+200;
		pointsX[1] = newObject[4]+200;
		pointsX[2] = newObject[7]+200;
		pointsX[3] = newObject[10]+200;
		pointsY[0] = ddobject[2][0]+200;
		pointsY[1] = ddobject[4][0]+200;
		pointsY[2] = ddobject[8][0]+200;
		pointsY[3] = ddobject[11][0]+200;

		System.out.println(pointsX[0]+" bei "+pointsY[0]);
		System.out.println(pointsX[1]+" bei "+pointsY[1]);
		System.out.println(pointsX[2]+" bei "+pointsY[2]);
		System.out.println(pointsX[3]+" bei "+pointsY[3]);
	}

	public int[] turnY(int x1 ,int z1,int x2, int z2, int x3,int z3, int x4, int z4, int rot){

		System.out.println("um "+rot+" gedreht...");
			double hyp1 = Math.sqrt(x1*x1+z1*z1);
			double hyp2 = Math.sqrt(x2*x2+z2*z2);
			double hyp3 = Math.sqrt(x3*x3+z3*z3);
			double hyp4 = Math.sqrt(x4*x4+z4*z4);

			double winkel1, winkel2, winkel3, winkel4;

			if(x1<0 && z1>0)winkel1=rot*(-1)+Math.toDegrees(Math.atan(z1/x1));
			else if(z1<0 && x1>0)winkel1=rot*(-1)+Math.toDegrees(Math.atan(z1/x1));
			else winkel1=rot+Math.toDegrees(Math.atan(z1/x1));

			if(x2<0 && z2>0)winkel2=rot*(-1)+Math.toDegrees(Math.atan(z2/x2));
			else if(z2<0 && x2>0)winkel2=rot*(-1)+Math.toDegrees(Math.atan(z2/x2));
			else winkel2=rot+Math.toDegrees(Math.atan(z2/x2));

			if(x3<0 && z3>0)winkel3=rot*(-1)+Math.toDegrees(Math.atan(z3/x3));
			else if(z3<0 && x3>0)winkel3=rot*(-1)+Math.toDegrees(Math.atan(z3/x3));
			else winkel3=rot+Math.toDegrees(Math.atan(z3/x3));

			if(x4<0 && z4>0)winkel4=rot*(-1)+Math.toDegrees(Math.atan(z4/x4));
			else if(z4<0 && x4>0)winkel4=rot*(-1)+Math.toDegrees(Math.atan(z4/x4));
			else winkel4=rot+Math.toDegrees(Math.atan(z4/x4));

			int out[] = new int[13];
			out[1]=(int)(Math.cos(Math.toRadians(winkel1))+hyp1);
			out[4]=(int)(Math.cos(Math.toRadians(winkel2))+hyp2);
			out[7]=(int)(Math.cos(Math.toRadians(winkel3))+hyp3);
			out[10]=(int)(Math.cos(Math.toRadians(winkel4))+hyp4);
			out[3]=(int)(Math.sin(Math.toRadians(winkel1))+hyp1);
			out[6]=(int)(Math.sin(Math.toRadians(winkel2))+hyp2);
			out[9]=(int)(Math.sin(Math.toRadians(winkel3))+hyp3);
			out[12]=(int)(Math.sin(Math.toRadians(winkel4))+hyp4);

			return out;
		}


	public void paint(Graphics g) {
		initPolObject();

		g.fillPolygon( pointsX, pointsY,4 );
		g.drawString("Welcome to Java!!", 50, 60 );
		g.setColor(Color.red);
		g.fillOval(198,198,4,4);
		g.setColor(Color.blue);

		g.fillOval(pointsX[0]-8,pointsY[0]-8,4,4);
		g.fillOval(pointsX[1]-8,pointsY[1]-8,4,4);
		g.fillOval(pointsX[2]-8,pointsY[2]-8,4,4);
		g.fillOval(pointsX[3]-8,pointsY[3]-8,4,4);
	}
}
```


das ganze soll so funktionieren, das es in einem 2dimensionalem array polygone(4-eckige) definiert werden (ich habe jetzt erstmal eine fläche) zu jeder fläche gehören 4x x, y, und z koordinaten. dieses wird (erstmal) um die Y-Achse gedreht. ich glaube ich habe irgentwo etw vergessen, aber ich finde die stelle nicht  hoffe jmd hat die zeit und die lust mir zu helfen


----------



## Marco13 (9. Mrz 2012)

Ist ja klar, dass das nicht geht: Es darf nicht

```
if(x3<0 && z3>0)winkel3=rot*(-1)+Math.toDegrees(Math.atan(z3/x3));
else if(z3<0 && x3>0)winkel3=rot*(-1)+Math.toDegrees(Math.atan(z3/x3));
else winkel3=rot+Math.toDegrees(Math.atan(z3/x3));
```
heißen, sondern muss

```
if(x3<0 && z3>0)winkel3=rot*(-1)+Math.toDegrees(Math.atan(z3/x3));
else if(z3<0 && x3>0)winkel3=rot*(-2)+Math.toDegrees(Math.atan(z2/x3));
else winkel3=rot+Math.toDegrees(Math.atan(z3/x3));
```
lauten!


:joke:

Also... nur weil man Java3D nicht verwenden will, heißt das ja nicht, dass man sich nicht Interfaces/Klassen schreiben kann wie

```
class Point { /* float x,y,z */

class Matrix
{
    Point rotateY(Point p, float angleDegrees) ...
    ...
}
```
Was soll das denn sonst werden, wenn es "fertig" ist?


----------



## Chloroplast (9. Mrz 2012)

war das jetzt auf alle 4 stellen bezogen? und, ich muss gestehen, interfaces habe ich noch nie gemacht. ich hatte java mal ein jahr als AG und danach halt übers internet. und das ist jetzt nur ein Applet zu testen, später soll das eine (mehrere) klassen werden mit denen ich 3D-Spiele entwickeln kann.


----------



## Marco13 (9. Mrz 2012)

Hmja... solche Threads gibt's öfter, in ähnlicher Form, und oft wird dann ganz einfach gesagt: "Lass es bleiben, da kommt nur Mist raus". Das werde ich nicht sagen. Ich sage: "Das kannst du gerne versuchen (aber geh nicht davon aus, dass etwas anderes als Mist rauskommt)". Im Ernst, 3D-Grafik ist ... (summ...) nicht so einfach, und wenn du von Interfaces noch nichts gehört hast, und bei der Berechnung einer Rotation mit atan und if-Abfragen hantierst, ist schon ein einfacher, rotierender Drahtgitterwürfel mit orthographischer Projektion ein sehr hoch gestecktes Ziel - von Texturen mal ganz abgesehen (vergiß drawPolygon). Es spricht nichts dagegen, sich mal ein paar Sachen in dieser Richtung anzusehen, ich denke, es kann hilfreich sein, mal den frustrierenden Weg der eigenen Matriximplemeintierung und des guten alten Bresenham gagangen zu sein - wenn man SEHR viel Zeit hat. Wenn man eine Basis für 3D-Spiele will, ist das aber der falsche Weg. Einige der richtigERen sind auf Java und 3D-Grafik - it's engine driven [whoopsie's homepage] zusammengefasst.

EDIT: Nur falls das falsch ankam: Die gepostete Code"Korrektur" sollte nur ein Witz sein - ein Wink mit dem Zaunpfahl, der so viel heißen sollte wie: "Was auch immer du da rechnest, es wird kaum jemand nachvollziehen wollen, und wenn doch dann wird er kaum einen Fehler finden, der aus so etwas einfachem wie einem Vorzeichenfehler besteht". Wobei - was zum ... ... ... du da mit dem atan machst, wäre schon fast wert, mal nachvollzogen zu werden


----------



## Chloroplast (9. Mrz 2012)

soll ich mal versuchen es zu erklären? zeit ist bei mir nicht das problem, ist halt mehr ein hobby. ich guck mir das mal an... ich wollte halt versuchen, das ganze so zumachen, das es eben keine weiteren sachen braucht... ich weiss jetzt nicht in wie fern OpenGL vorrausgesetzt ist... mal gucken


----------



## Marco13 (10. Mrz 2012)

Was meinst du mit "keiner weiteren Sachen"? Heißt das "keine weiteren JARs"?

EDIT: Java3D ist so gesehen tatsächlich "unhandlich", weil es installiert werden muss, aber eine normale JAR sollte doch kein Problem sein ???:L


----------



## Chloroplast (10. Mrz 2012)

eine normale jar ist auch nicht das problem, aber ich habe im moment eigentlich keine grafikkarte (nur die onboard, aber die ist total schlecht) da steht ja was von der grafikkarte gestützen 3d; ich weiss nicht ob meine grafikkarte das packt


----------



## Fu3L (10. Mrz 2012)

Wenns einer von den Core i Prozessoren von Intel ist, dann packen die das. Damit kannst du auch GTA Vice City oder ähnlich alte Spiele spielen^^ 
(Und soweit ich weiß, ist Java3D nicht das höchstmodernste)


----------



## Chloroplast (10. Mrz 2012)

ich weiss jetzt nicht was meine onboardgrafikkarte ist, ich weiss inzwischen nur... sie ist zu schlecht. ich mir jetzt 3 von den 3D sachen bei dem link weiter oben angesehen, und, meine grafikkarte packt das nicht (nur die applets davon) von daher muss ich wohl meine sache weiterentwickeln


----------



## Marco13 (10. Mrz 2012)

jPCT - a free java 3d engine featuring software rendering and OpenGL support with texture mapping, shaders and skeletal animation. An Android version is also available. Kann auch Softwarerendering....


----------



## Guest2 (10. Mrz 2012)

Moin,



Chloroplast hat gesagt.:


> ich weiss jetzt nicht was meine onboardgrafikkarte ist, ich weiss inzwischen nur... sie ist zu schlecht.



Versuch auch z.B. mal: Klick!(LWJGL per Webstart)

Ich kann mir nämlich kaum vorstellen, dass es noch Rechner gibt, die gar kein OpenGL können.

Viele Grüße,
Fancy


----------



## Marco13 (10. Mrz 2012)

Das verlinkte Beispiel werde ich mal ausprobieren, um diese Aussage zu bestätigen. Ich muss es vorher nur auf eine 5 1/4-Zoll-Diskette kopieren... :reflect: 

:joke:


----------



## Chloroplast (10. Mrz 2012)

passiert nichts.. ausser das er bisschen rechnet, und das halt der typische webstart ist,passiert nichts


----------



## Chloroplast (10. Mrz 2012)

und bei dem anderen.... ich weiss nicht wie ich das benutzen soll... gäbe es vllt. die möglichkeit, dass mir das ein netter mensch erklärt?


----------



## Guest2 (10. Mrz 2012)

Marco13 hat gesagt.:


> Das verlinkte Beispiel werde ich mal ausprobieren, um diese Aussage zu bestätigen. Ich muss es vorher nur auf eine 5 1/4-Zoll-Diskette kopieren... :reflect:
> 
> :joke:



Hoffentlich hast Du noch genug von den Dingern, die JRE musst Du dann ja wahrscheinlich auch noch kopieren... 




Chloroplast hat gesagt.:


> passiert nichts.. ausser das er bisschen rechnet, und das halt der typische webstart ist,passiert nichts



Staun, ich vermute den Fehler trotzdem woanders ... Selbst ein mir bekannter 9 Jahre alter Bürorechner mit onbord Grafikchip macht OpenGL 2.0 ohne murren.
(Allerdings davon ausgehend das Dein Rechner kein 5 1/4 Zoll Laufwerk mehr hat )


Viele Grüße,
Fancy


----------



## Chloroplast (10. Mrz 2012)

mein PC ist eigentlich garnicht so schlecht... mit 4GB arbeitsspeicher und einem AMD Phenom(tm) II X6 1055T 2.80 GHz 64bit betriebssystem windows 7. nur halt OnBoard grafikkarte


----------



## Fu3L (10. Mrz 2012)

Wie schafft man es, so einen PC ein Bild anzeigen zu lassen ohne, dass er OpenGL fähig ist?^^ Schließe mich daher Fancys Meinung an..
Sollte es aber tatsächlich dran liegen: Lieber 30 € für ne Grafikkarte (vorrausgesetzt es handelt sich nicht um einen Laptop), als das Rad neu zu erfinden


----------



## Chloroplast (10. Mrz 2012)

was hätte den passieren sollen?


----------



## Fu3L (10. Mrz 2012)

Das Webstart Teil müsste nachdems fertiggeladen hat so 3 rot, grün, blaue Zahnräder anzeigen, die sich 'n bisschen bewegen^^


----------



## Marco13 (10. Mrz 2012)

Ja, das sollte auf jeden Fall funktionieren. Was für eine GraKa (chipsatz) hast du denn? Vielleicht nur irgendeinen Steinalten Windows-Eigenen Treiber installiert? Schau mal auf der Herstellerwebseite, ob du einen neueren Treiber bekommst


----------



## Chloroplast (11. Mrz 2012)

NVidia GeForce 7025 sagt windows...


----------



## Chloroplast (11. Mrz 2012)

und sagt alle sis up to date


----------



## Guest2 (11. Mrz 2012)

Ok, die kann zwar nicht viel, aber en bissel sollte schon gehen...

Hast Du mal den aktuellen NVIDIA Treiber installiert? Den gibt es hier.

Und dann vielleicht noch mal versuchen.

Viele Grüße,
Fancy


----------



## Chloroplast (11. Mrz 2012)

jetzt gehts  aber dir drehen sich garantiert net langsam^^


----------



## Chloroplast (11. Mrz 2012)

und wie benutz ich das jetzt? kann mir das jmd vllt erklären der gaanz viel zeit hat?


----------



## Marco13 (11. Mrz 2012)

Was genau? OpenGL? Dann such' nach Threads, in denen Fancy geantwortet hat  Oder das konkrete Conway-Beispiel?

Hoppala, das ist gar nicht der Conway-Thread  (sowas peinliches  ). Zu OpenGL an sich gibt's viele Tutorials. Oft sind die für C, oder für JOGL, aber die nach LWJGL zu portieren ist i.a. nicht so aufwändig. Am besten mal ein, zwei einfache Beispiele anschauen und ein bißchen rumspielen. Für's systematischere gibt's dann ... ja, in letzter Konsequenz GANZ ausführliche Dinge wie Learning Modern 3D Graphics Programming , könnte aber für den Anfang ein Overkill sein.


----------



## Chloroplast (12. Mrz 2012)

ich hab ja nicht mal eine ahnung wie ich das überhaupt einbinden soll... ich hab biss jetzt eigentlich nur mit dem elementaren java beschäftigt


----------



## truesoul (12. Mrz 2012)

Hallo.

Es wurde schon erwähnt das du auch Lib's bzw Jar's von Java3D mitliefern kannst, und ansonsten wird nur noch die nativen libraries (dll) benötigt. Und dann kann "jeder!?" Java3D Anwendungen ausführen. 

Wie man Lib's zu Projekten hinzufügt kann man sich sicherlich super erGooglen. 
Oder ein Beispiel wäre das hier: 
How to install Java3D

Wenn es LWJGL sein soll dann das hier:
lwjgl.org - Home of the Lightweight Java Game Library

Und wenn es was anderes werden soll, dann lässt sich bestimmt auch das per Google finden  

Es gibt ja auch Tutorials für Java3D etc.


----------



## Evil-Devil (12. Mrz 2012)

LWJGL bzw. JOGL einzubinden ist nicht sonderlich schwierig. Schau am besten die Beispiele auf den jeweiligen Seiten an oder frage hier bzw. dort in den Foren. Zunächst müsstest du dir die Libs der jeweiligen Bindings herunterladen.

[edit]Verdammt, zu langsam gewesen...[/edit]


----------

