2012-05-06 5 views
1

私のコースのうち、私はhtml5キャンバスで3Dアプリケーションをプログラミングする必要があります。私はThree.jsを使いました。今のところ、私がしようとしているのは、単純な飛行機をレンダリングすることだけです。私はまた、マウスを押しながらドラッグすることによって、x軸に沿ってカメラを動かすことができるようにしたい。私のコードはhereというコードに基づいています。それは基本的には回転している飛行機です(またはカメラが飛行機の周りを回っていますが、どちらが確実かはわかりません)。アニメーションのコードをすべて捨て、mousedown、mousemoveなどのイベントのコードを追加しました。私はページを読み込むときに飛行機をレンダリングします(無生物です)。しかし、マウスを使って移動させようとすると、それを完全に無反応のままにしています。私のコードでは、物事を動かすために、私が多分持ってはいけないものを変更した(いくつかの変数をグローバルにし、いくつかの関数名を変更した)ことを気づいたかもしれませんが、結果は変わりません。javascriptの確認と実行の問題(html5 canvas)

これは私が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> 
+0

http://jsfiddle.net/mplungjan/TVWYn/ – mplungjan

+0

jsFiddleはThree.jsとjQueryの両方を含むように修正されました:http://jsfiddle.net/TVWYn/2/ - まだどんな平面も見ていない。 – Xenethyl

+0

あなたはhtmlに入れたURLをライブラリの1つ(私の質問のようなもの)に変更しました。それはブラウザのように飛行機を表示します:http://jsfiddle.net/TVWYn/3/ – Zypp

答えて

1

あなたは正常に動作してからコードを防止している、ここで様々な問題を持っています。私はを経て、それらを固定し、そしてあなたは今、x軸に沿ってカメラを移動させることができました:

http://jsfiddle.net/TVWYn/6/

あなたの問題があった。

  1. あなたはjQueryのを使用して含めていませんjQueryライブラリ sign関数はJavaScriptの一部ではありません。 DOMYで作業するjQueryというサードパーティ製のライブラリ(これは )の部分です。 jQueryライブラリを含まないと、マウスハンドラー を実行できませんでした。

  2. jQueryが含まれていても、セットアップ機能 の実行順序が間違っていました。もともと、あなたのThree.jsセットアップ は、DOMが初期化された後に実行されるようなプロセスを持っていました。 いいですね。しかし、ブラウザがJSを取得した直後にマウスイベント ハンドラを登録しようとしていました。この は良くありません。その時点で存在しないDOM要素にマウスイベントハンドラをアタッチするようJSに依頼しています。これを修正するには、 DOMが既に初期化されていること(たとえば、window.onload内で設定を実行している)と 必要な要素が既に挿入されていることを確認する必要があります(この場合は #canvas)。または、イベントハンドラをDOMオブジェクトに直接添付します(例:renderer.domElement)。

  3. キャンバス要素のidを設定することなく、#canvasを参照していました。適切な開発環境をセットアップに関しては

、私は強くあなたが(ctrl + shift + jから起動されます)Chromeとその開発ツールの使用を開始することをお勧めします。

+0

どうもありがとう!私はあなたの答えを役に立つとタグ付けしますが、まだ十分な評判がありません:( – Zypp

+0

あなたは大歓迎です。アップヴォートについて心配しないで、私は働いてうれしいです新しい言語で作業するのは難しいかもしれませんが、JSはまさに簡単には堪能できません:) – Xenethyl

+0

最新バージョンはこちら[http://jsfiddle.net/TVWYn/9 /埋め込み/結果/)。 xとyの両方に応答し、マウスボタンを離す前に最後のマウス位置を覚えています(再度クリックするたびに平面位置がリセットされないようにします)。 – Zypp