私のコースの1つでは、html5キャンバスで3Dアプリケーションをプログラムする必要があります。このために私はThree.jsを使用することにしました。今のところ、私がやろうとしているのは、単純な平面をレンダリングすることだけです。また、マウスを押したままドラッグすることで、カメラをx軸に沿って移動できるようにしたいと思います。ここにあるコードに基づいてコードを作成しました。これは基本的に、回転している平面です(または、カメラが平面の周りを回転していますが、どちらかはわかりません)。アニメーションのすべてのコードを破棄し、mousedown、mousemoveなどのイベントのコードを追加しました。ページをロードすると、平面(無生物)は問題なくレンダリングされますが、マウスを使用してページを移動しようとすると、完全に応答しなくなります。私のコードでは、動作させるために、持ってはいけないものを変更した(いくつかの変数をグローバルにし、いくつかの関数名を変更した)ことに気付いたかもしれませんが、結果は同じままでした。
javascriptを使用するのはこれが初めてであり、既存のコードを変更して機能することを期待することはできないことに気付きました。javascriptの検証を調べたところ、JSLintが見つかりました。notepad ++のプラグインをダウンロードし、その方法でコードを検証しようとしました。それはhtmlタグが好きではなく、私がインポートしようとしているThree.jsライブラリを特に嫌っています。urlとしてインポートしても検出されず、ダウンロードしてファイルをインポートしてもインポートされません。ライブラリ全体のコードをファイルにコピーしたところ、ライブラリ自体に関する多くのエラーが発生し、コードが開始する前に検証を停止しました。
結論:プロジェクト自体だけでなく、快適な開発環境のセットアップ(インポートを無視しない適切な検証を伴う)についても、いくつかの支援が必要です。
最後に、これまでの私のコード:
<!DOCTYPE HTML>
<html>
<head>
<title>Canvas demo</title>
</head>
<body>
<script type="text/javascript" src="three.js">
</script>
<script type="text/javascript">
var camera;
var scene;
var plane;
var renderer;
var clickX;
var clickY;
var mousedown;
window.onload = function () {
renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
//camera
camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 1000);
camera.position.y = -450;
camera.position.z = 400;
camera.rotation.x = 45;
//scene
scene = new THREE.Scene();
//plane
plane = new THREE.Mesh(new THREE.PlaneGeometry(300, 300), new THREE.MeshBasicMaterial({color: 0x0000ff}));
plane.overdraw = true;
scene.add(plane);
rerender();
};
window.requestAnimFrame = (function (callback){
return window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function(callback){
window.setTimeout(callback, 1000 / 60);
};
})();
function rerender(){
//render
renderer.render(scene, camera);
//request new frame
requestAnimFrame(function(){
rerender();
});
}
$('#canvas').mousedown(function(e){
clickX = e.pageX - this.offsetLeft;
mousedown = true;
});
$('#canvas').mousemove(function(e){
if(mousedown) {
var xDiff = e.pageX - this.offsetLeft - clickX;
camera.position.x = xDiff;
rerender();
}
});
$('#canvas').mouseup(function(e){
mousedown = false;
});
$('#canvas').mouseleave(function(e){
mousedown = false;
});
</script>
</body>
</html>