Three.js - Texturen

02/13/2012 23:31 PseudoPsycho#1
Habe vor kurzem mit [Only registered and activated users can see links. Click Here To Register...] angefangen und verzweifle gerade an den Texturen:
Code:
<!Doctype html>
<html>
	<head>
		<meta charset="utf-8">
		<title>Sample Three.js</title>
	<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script>
	<script src="js/Three.js"></script>
	<script type="application/javascript">
$(document).ready(function(){
	// set the scene size
	var WIDTH = 400,
	    HEIGHT = 300;

	// set some camera attributes
	var VIEW_ANGLE = 45,
	    ASPECT = WIDTH / HEIGHT,
	    NEAR = 0.1,
	    FAR = 10000;

	// get the DOM element to attach to
	// - assume we've got jQuery to hand
	var $container = $('#container');

	// create a WebGL renderer, camera
	// and a scene
	//var renderer = new THREE.WebGLRenderer();
                    var renderer=new THREE.CanvasRenderer();
	var camera = new THREE.PerspectiveCamera(  VIEW_ANGLE,
	                                ASPECT,
	                                NEAR,
	                                FAR  );
	var scene = new THREE.Scene();

	// the camera starts at 0,0,0 so pull it back
	camera.position.z = 300;

	// start the renderer
	renderer.setSize(WIDTH, HEIGHT);

	// attach the render-supplied DOM element
	$container.append(renderer.domElement);

	// create the sphere's material
var texture = THREE.ImageUtils.loadTexture('image.jpg');
	var sphereMaterial = new THREE.MeshLambertMaterial({
map:texture
//color:0xCC0000
 });


	// set up the sphere vars
	var radius = 50, segments = 16, rings = 16;

	// create a new mesh with sphere geometry -
	// we will cover the sphereMaterial next!
	var sphere = new THREE.Mesh(
	   new THREE.SphereGeometry(radius, segments, rings),
	   sphereMaterial);
sphere.overdraw=true;

	// add the sphere to the scene
	scene.add(sphere);

	// create a point light
	var pointLight = new THREE.PointLight( 0xFFFFFF );

	// set its position
	pointLight.position.x = 10;
	pointLight.position.y = 50;
	pointLight.position.z = 130;

	// add to the scene
	scene.add(pointLight);

	// draw!
	renderer.render(scene, camera);
});
	</script>

		<style>
			#container {
				background: #000;
				width: 400px;
				height: 300px;
			}
		</style>
	</head>
	<body><div id="container"></div></body>
</html>
Ich habe einfach mal die Farbe durch eine Textur ersetzt:
Code:
var texture = THREE.ImageUtils.loadTexture('image.jpg');
	var sphereMaterial = new THREE.MeshLambertMaterial({
map:texture
//color:0xCC0000
 });
und sowohl mit CanvasRenderer, wie auch WebGLRenderer getestet.
In ersterem wird die Anweisung ignoriert und der Kugel keine Farbe zugewiesen, beim WebGL-Renderer verschwindet sie einfach...
Wenn ich stattdessen die Farbe verwende, funktioniert alles.
Was habe ich falsch gemacht???
02/15/2012 17:58 PseudoPsycho#2
'dachte mir schon fast, dass sich mit sowas hier keiner auskennt...
Problem besteht immernoch!
02/16/2012 15:15 JPGaming#3
Also soweit ich weiß, braucht canvas auch sein <tag>, sonst malt der nichts.
02/16/2012 15:24 PseudoPsycho#4
Quote:
Originally Posted by JPGaming View Post
Also soweit ich weiß, braucht canvas auch sein <tag>, sonst malt der nichts.
Der Canvas-Tag wird von Three.js automatisch erstellt.
Code:
renderer.setSize(WIDTH, HEIGHT);
//...
renderer.render(scene, camera);
Und wie gesagt, ohne die Textur funktioniert alles:
Quote:
Originally Posted by PseudoPsycho
Wenn ich stattdessen die Farbe verwende, funktioniert alles.
02/16/2012 21:40 Fratyr#5
Quote:
'dachte mir schon fast, dass sich mit sowas hier keiner auskennt...
Problem besteht immernoch!
Wenn du schon hier so auftrumpfst müsstest du wohl auch wissen das JavaScript nicht
asynchron ist. D.h. das JavaScript nicht darauf wartet bis eine Anweisung vollendet wurde,
sondern während es noch an der einen arbeitet schon mit der nächsten beginnt, deshalb
ist es in JavaScript wichtig Callbacks zu verwenden.

Quote:
var sphereMaterial = new THREE.MeshLambertMaterial();
wird folglich nur wenige millisekunden nach THREE.ImageUtils.loadTexture('image.jpg');
aufgerufen. Wenn du das Bild nicht per preloading eingebunden hast ist die variable
"texture" also zum Zeitpunkt zu dem dein Model erstellt wird noch kein "richtiges" Bild
und kann somit auch nicht als textur verwendet werden.

Das sollte die naheliegenste Lösung sein,
02/17/2012 21:20 PseudoPsycho#6
Quote:
Originally Posted by Fratyr View Post
Wenn du schon hier so auftrumpfst müsstest du wohl auch wissen das JavaScript nicht
asynchron ist. D.h. das JavaScript nicht darauf wartet bis eine Anweisung vollendet wurde,
sondern während es noch an der einen arbeitet schon mit der nächsten beginnt, deshalb
ist es in JavaScript wichtig Callbacks zu verwenden.



wird folglich nur wenige millisekunden nach THREE.ImageUtils.loadTexture('image.jpg');
aufgerufen. Wenn du das Bild nicht per preloading eingebunden hast ist die variable
"texture" also zum Zeitpunkt zu dem dein Model erstellt wird noch kein "richtiges" Bild
und kann somit auch nicht als textur verwendet werden.

Das sollte die naheliegenste Lösung sein,
Jo, weiß ich natürlich...
Ich hab's auch schon mit Vorladen und mir Callbacks versucht, hat nur alles nicht geholfen... Hab' hier einfach mal den einfachsten Code gepostet. ;)