今天要完成兩件事,
首先就是滑鼠的滾輪可以控制地球的大小縮放
第二就是滑鼠的拖曳可以旋轉地球
參考了這個網站
http://www.sitepoint.com/html5-javascript-mouse-wheel/
之後整件事就變得非常簡單。
首先,我們要加入一個控制距離的變數
var distance=3;
function setupWebGL()
{
...
mat4.translate(mvMatrix, [0.0, 0.0, -distance]);
...
}
由於我們設定是地球的中心就是OpenGL,而攝影機固定不動,
所以distance的值越大,畫面就離地球越遠,地球就越小
然後加入以下函式
function initWheelEvent(canvas)
{
if (canvas.addEventListener) {
// IE9, Chrome, Safari, Opera
canvas.addEventListener("mousewheel", MouseWheelHandler, false);
// Firefox
canvas.addEventListener("DOMMouseScroll", MouseWheelHandler, false);
}
// IE 6/7/8
else canvas.attachEvent("onmousewheel", MouseWheelHandler);
}
function MouseWheelHandler(e) {
// cross-browser wheel delta
var e = window.event || e; // old IE support
var delta = Math.max(-1, Math.min(1, (e.wheelDelta || -e.detail)));
distance+=delta*0.1;
return false;
}
initWheelEvent接受canvas當作參數,處理跨平台的mouse wheel事件
MouseWheelHandler則是事件處理者,得到滾輪位移的量值之後直接加上distance,
然後再init函式中加入initWheelEvent就可以用滾輪控制地球大小了!
接下來是滑鼠拖曳的功能,我們希望按住左鍵左右拖曳,可以讓地球以y軸選轉,上下可以讓地球繞x軸旋轉
所以我們創了兩個變數
var angle=0;
var phi=0;
function setupWebGL()
{
mat4.rotate(mvMatrix, angle, [0.0, 1.0, 0.0]);
mat4.rotate(mvMatrix, phi, [1.0, 0.0, 0.0]);
}
接著參考這個網站:http://javascript.info/tutorial/mouse-events#simple-events
寫出拖曳的函式
function initMouseDragEvent(canvas)
{
canvas.onmousedown=function(e){
e = e || event;
oldPosX = e.clientX;
oldPoxY = e.clientY;
document.onmousemove = function(e) {
e = e || event;
var deltax = e.clientX-oldPosX;
var deltay = e.clientY-oldPoxY;
oldPosX = e.clientX;
oldPoxY = e.clientY;
angle += 0.005*deltax;
phi += 0.005*deltay;
}
this.onmouseup = function() {
document.onmousemove = null;
}
}
}
上面這個函式的意思是,若是當滑鼠點擊canvas區域時,整個視窗的mousemove事件就是要改變我們那兩個角度變數
一放開mousemove事件就取消。
然後一點擊canvas就記錄滑鼠點擊位置,然後依次觸發mousemove事件就可以算出x與y方向的移動量,
以此來旋轉地球!
在init函式中加入initMouseDragEvent,就可以與使用者基本的互動了