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

2013年02月23日

Three.js でキューブの『テクスチャ面設定』とスケール・X軸回転を jQuery のスライダーでテストする

※ 現時点で既に Three.js(r56:2013/02/15) が出ています。



jsdo.it での実行
jsdo.it のソースコード公開ページ

座標系のテスト

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

Three.js の全体像はとても把握しずらいので、調整内容を別々に確認したほうが良いので、まず最初に座標系のテストコードを作成しています。

キューブに関する値の変更

厳密に言うと、

1) Geometry ( どのような形状、つまりどのような座標で表現されるか )
2) Material ( 材質、つまりどのような表示特性を持つか )
3) 3Dオブジェクト ( Geometry と Material で、表示対象の実体としての『もの』)

みたいな事になっています。ここで、スケールとX軸回転は、3) に対して行っているので、とても一般的なものであり、見え方としては『カメラ』と同様な意味があります。但し、『カメラ』はシーンに対して動作が反映されるので、対象物が二つ以上の場合には、3Dオブジェクト を動かすのとは違った意味になって来ます。

3Dオブジェクト が一つの場合は、カメラの動作は相対的に考えて似たようなものになります。

材質に対する両面性

.side というプロパティに、0、1、2 をセットする事によって、前面、背面、両面というテクスチャの描画方法が決まります。これは、カメラがその3Dオブジェクトの中に入ってしまった時にとても意味があるのですが、ここではテクスチャ自身に透過PNG を使って効果を解りやすくしています。

通常、テクスチャは透過していなてので、3Dオブジェクトの中は意味が無い場合も多いですが、例えば球状の空を球の裏側に貼りつけて、カメラを中に置く場合もあり、カメラの視点移動が前提で、外側から見る必要がある場合もあるかもしれません。
// side

THREE.FrontSide = 0;
THREE.BackSide = 1;
THREE.DoubleSide = 2;
この両面パラメータは、r55 からかどうかは確認していませんが、つい最近の過去のバージョンから r50 から仕様変更がされています。
[Change log]
Object3D's flipSided and doubleSided properties are now Material's side property
javascript - Three.js: The Surface is One-Sided - Stack Overflow その他にも調整の為の仕様変更 MeshLambertMaterial の Canvas での動作が、MeshBasicMaterial と同様に変更されています。これは以前からの仕様変更に伴う調整がやっと追いついた感じのものですが、以前はキューブそのものに色が付いていたので、それはそれで代替えがあったらと思うのですが、調べるのは困難です。
<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: url(https://lh4.googleusercontent.com/-qGsOjUoCvyw/T-VZ62iPMSI/AAAAAAAAG5Y/O0NhvMUvm9U/s200/_img.png);
	border: solid 1px #000000;
}
</style>
<table>
<tr>
<td style='width:120px;'>前面/後面/両面</td>  <td></td><td><div id="slider1"></div></td><td>  </td>
</tr><tr>
<td>スケール</td><td> -</td><td><div id="slider2"></div></td><td> + </td>
</tr><tr>
<td>x 座標を回転</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">
// *************************************
// 前面 / 後面 / 両面
// *************************************
$(function () {
	$("#slider1").slider({
		range: "min",
		step: 1,
		min: 0,
		max: 2,
		value: 0,
		slide: function (event, ui) {
			material.side = ui.value;
		}
	});
});
// *************************************
// スケール
// *************************************
$(function () {
	$("#slider2").slider({
		range: "min",
		step: 0.01,
		min: -4,
		max: 4,
		value: 1,
		slide: function (event, ui) {
			cube.scale.x = cube.scale.y = cube.scale.z = ui.value;
		}
	});
});

// *************************************
// x 座標を回転
// *************************************
$(function () {
	$("#slider3").slider({
		range: "min",
		step: 0.01,
		min: -1 * Math.PI,
		max: 1 * Math.PI,
		value: 0.6,
		slide: function (event, ui) {
			cube.rotation.x = ui.value;
console.log(ui.value)
		}
	});
});

var v_width = 500;
var v_height = 500;
var v_iamge_url = 'http://toolbox.winofsql.jp/image/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, 0, 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>
WebGLRenderer に差し替えて実行する時の注意

Canvas では、Image オブジェクトにに別ドメインを指定しても問題無かったのですが、WebGL ではエラーになっていたので注意して下さい

とりあえずすぐテストしたい場合

http://toolbox.winofsql.jp/tool_html_links.htm



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