SQLの窓 イラストAC フリー素材

2013年02月22日

Three.js の座標系の向きを テクスチャを貼りつけたキューブと jQuery のスライダー で確認する



http://jsdo.it/sworc/rJym/fullscreen

Three.js で苦労する事

とにかく、Three.js は 3D を扱うので奥が深いです。専門用語も最初はさっぱり解りませんし、3D に関する日本語の解説を探すのも一苦労です。

参考

カメラのレンズの種類

さらに Three.js のアップデートは速度は速く、頻繁に行われるのでいろいろ注意しなければならない事も多いのですが、何より『パラメータ』の多さに頭がクラクラします。

アプリケーションを作っていても、その時は覚えていますが、『カメラの引数の意味はええ・・っと』みたいな事は良くあって、こんな時は実際に動かすのが一番なんですが、準備に結構時間もかかったり。

で、そんな時の為の方法としては、jQuery の スライダーを使うといいと思うのです。

jsdo.it のメリット

何と言っても、他人のコードを試してみたい時に『フォーク』すれば、直ぐに開発環境が整うところです。自分にしても、自分のサイトで環境を作るより手軽に公開できて、自分で再確認もできます。

自分のサイトだと、安心しきっちゃってコードが間違っていても、気が付かない事も多いですが、jsdo.it に貼ったとたんいろいろ気になってチェックもしますし、一石三鳥 ぐらいの効果もあります。

jsdo.it では、フルスクリーンの実行画面でソースコードを見れば全体像がわかるし、公開ページでは JavaScript と HTML と CSS を分けて書くようになっているので分析もしやすいです。

唯一・・・ちょっと重いので、埋め込みコードは使わないほうがいいです。例えば、埋め込みコードをブログに貼ると、そこが固まるせいでブログがそこ以降表示されなかったりします。
<link rel="stylesheet" href="https://googledrive.com/host/0B9Jymqpro6gSVlB5Wm52U29wTlE/jquery/jqcss/black-tie/jquery-ui-1.8.20.custom.css" type="text/css" />
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.0/jquery-ui.min.js"></script>
<script type="text/javascript" src="http://homepage2.nifty.com/lightbox/three//three.min55.js"></script>

<style type="text/css">
td {
    padding: 5px;
}

#slider1, #slider2, #slider3 {
	width: 200px;
	margin: 0 0 0 20px;
}

#container_three canvas {
	background-color:#e0e0e0;
	border: solid 1px #000000;
}
</style>

<table>
<tr>
<td style='width:50px;'>x 座標</td><td> -</td><td><div id="slider1"></div></td><td> + </td>
</tr><tr>
<td>y 座標</td><td> -</td><td><div id="slider2"></div></td><td> + </td>
</tr><tr>
<td>z 座標</td><td> -</td><td><div id="slider3"></div></td><td> + </td>
</tr>
</table>

<div id="base" style=''>
<div id="container_three"></div>
</div>

<script type="text/javascript">

// *************************************
// x 座標
// *************************************
$(function () {
	$("#slider1").slider({
		range: "min",
		step: 1,
		min: -200,
		max: 200,
		value: 0,
		slide: function (event, ui) {
			cube.position.x = ui.value;
		}
	});
});
// *************************************
// y 座標
// *************************************
$(function () {
	$("#slider2").slider({
		range: "min",
		step: 1,
		min: -200,
		max: 200,
		value: 0,
		slide: function (event, ui) {
			cube.position.y = ui.value;
		}
	});
});

// *************************************
// z 座標
// *************************************
$(function () {
	$("#slider3").slider({
		range: "min",
		step: 1,
		min: -450,
		max: 450,
		value: 0,
		slide: function (event, ui) {
			cube.position.z = ui.value;
		}
	});
});
</script>

<script type="text/javascript">

	var v_width = 500;
	var v_height = 500;
	var v_iamge_url = 'https://lh5.googleusercontent.com/-tpwrnApVF0Q/UJZ7JFriUeI/AAAAAAAALAY/sTLRuOhyX1U/s640/basic_elf.png';

	var container;
	var camera, scene, renderer;
	var mesh;
        var material,cube

	init();
	animate();

	function init() {

		container = document.getElementById( 'container_three' );

		scene = new THREE.Scene();

		camera = new THREE.PerspectiveCamera( 50, 1, 1, 10000 );
		camera.position.set( 0, -100, 650 );
		scene.add( camera );

		var image = new Image()
		image.onload = function () {

			var texture = new THREE.Texture( this );
			texture.needsUpdate = true;
			material = new THREE.MeshLambertMaterial({map: texture});
			material.overdraw = true;

			// キューブ
			cube = new THREE.Mesh(new THREE.CubeGeometry(200, 200, 200), material);
			cube.rotation.x = 0.6;

			scene.add(cube);
		};
		image.src = v_iamge_url;

		renderer = new THREE.CanvasRenderer();
		renderer.setSize( v_width, v_height );

		container.appendChild( renderer.domElement );

	}

	function animate() {

		requestAnimationFrame( animate );
		render();

	}

	function render() {

		if ( cube ) {
			cube.rotation.y -= 0.005;
		}
		renderer.render( scene, camera );

	}


</script>
関連する記事

THREE.PerspectiveCamera ( 透視法射影カメラ ) の引数

MeshLambertMaterial について

全てを確認したわけではありませんが、知ってる範囲において MeshLambertMaterial は、ライト効果を対応しているのですが、Canvas では意味を持ちません。以前作者さんが Canvas でも対応しようとしていた時期もありましたが、いろいろ問題があって、Canvas では MeshBasicMaterial と同等かな・・・とだいたいの感覚で思っていました。

Canvas 環境で、少し古いバージョンでは、 MeshLambertMaterial で、透過 png を使ってもキューブが透過されなかったのですが、( MeshBasicMaterial では透過されていた ) この 55 バージョンでは透過されるようです。

いずれにしても、本来の表現力は WebGL 使って初めて発揮されます。
( WebGL は画像(Imageオブジェクト)が同一ドメインでないと使えないようですが )


【Three.jsの最新記事】
posted by at 2013-02-22 21:19 | Three.js | このブログの読者になる | 更新情報をチェックする