var Tk = Tk || {};
Tk.gui = {};
Tk.canvas = {};
Tk.t3d = {};
//テキトーなのでなんとかしたい
Tk.t3d.objct= null;
Tk.gui.getElem = function(id){
return document.getElementById(id)
}
Tk.canvas.getCanvasContext = function(id){
var canvas = Tk.gui.getElem(id);
if (canvas.getContext) {
var context = canvas.getContext('2d');
}
return context
}
Tk.canvas.animate = function(ctx,time){
setInterval(
function(){
Tk.canvas.update(ctx)
}
,time)
}
Tk.canvas.clear = function(ctx){
ctx.fillStyle = "#FFFFFF"
ctx.fillRect(0,0,ctx.canvas.width,ctx.canvas.height);
}
Tk.canvas.setup = function(ctx){
var sp= new Tk.t3d.Sphere(200,10,10);
Tk.t3d.drawMesh(ctx,sp.points,sp.indices);
Tk.t3d.object = sp;
}
//更新しているけど、別に動いていない。
Tk.canvas.update = function(ctx){
Tk.canvas.clear(ctx);
var sp = Tk.t3d.object;
Tk.t3d.drawMesh(ctx,sp.points,sp.indices);
}
Tk.t3d.Point3d = function(x,y,z){
this.x = x;
this.y = y;
this.z = z;
}
Tk.t3d.Point = function(x, y){
this.x = x;
this.y = y;
}
Tk.t3d.Sphere = function(r,rows,cols){
this.r = r;
this.rows = rows;
this.cols = cols;
this.points = setPoints(r,rows,cols);
this.indices = setIndices(r,rows,cols);
function setPoints(r,rows,cols){
var pList = [];
for(var i = 0;i < rows; i++){
for(var j = 0;j < cols; j++){
var angle1 = Math.PI * 2 / ( cols -1 ) * j
var angle2 = Math.PI * i / ( rows -1 ) -Math.PI/ 2;
var point = new Tk.t3d.Point3d(
r * Math.cos(angle1) * Math.cos(angle2),
r * Math.sin(angle1) * Math.cos(angle2),
r * Math.sin(angle2)
);
pList.push(point)
}
}
return pList;
}
function setIndices(r,rows,cols){
var indices = [];
for(var i = 0;i < rows;i++){
for(var j = 0;j <cols; j++){
if( i < rows - 1 && j < cols -1){
indices.push([
i * cols + j,
i * cols + j + 1,
(i + 1) * cols + j])
indices.push([i * cols + j + 1,
(i + 1) * cols + j + 1,
(i + 1 ) * cols +j]);
}
}
}
return indices;
}
}
Tk.t3d.toPersePectionPoints = function(points){
var parsePection = 200;
var forcalLength = 250;
var pList = [];
for(var i = 0; i < points.length;i++){
var scale = forcalLength / ( forcalLength + points[i].z + parsePection)
pList.push(new Tk.t3d.Point(points[i].x * scale, points[i].y * scale));
}
return pList;
}
Tk.t3d.draw3d = function(ctx,points){
var drawPoints =Tk.t3d.toPersePectionPoints(points)
for(var i = 0; i < drawPoints.length;i++){
ctx.beginPath();
ctx.arc(drawPoints[i].x + 100, drawPoints[i].y + 100, 1, 0, Math.PI*2, false)
ctx.fill();
}
}
Tk.t3d.drawMesh = function(ctx,points,indices){
var drawPoints =Tk.t3d.toPersePectionPoints(points)
var offsetX = ctx.canvas.width / 2;
var offsetY= ctx.canvas.height / 2;
for(var i = 0; i < indices.length;i++){
var index = indices[i]
ctx.beginPath();
ctx.moveTo(points[index[0]].x + offsetX ,points[index[0]].y + offsetY );
ctx.lineTo(points[index[1]].x + offsetX ,points[index[1]].y + offsetY);
ctx.lineTo(points[index[2]].x + offsetX ,points[index[2]].y + offsetY );
ctx.lineTo(points[index[0]].x + offsetX ,points[index[0]].y + offsetY);
ctx.stroke();
}
}
Tk.t3d.main = function(){
var ctx = Tk.canvas.getCanvasContext("canvas_20130621");
Tk.canvas.setup(ctx);
Tk.canvas.animate(ctx,200);
}
Tk.t3d.main();
2013年6月21日金曜日
【JavaScript】Canvasを使ってとりあえず3Dの球を書いてみようと思ったんだけど、いまいちなんだかよくわからない。
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿