HTML5 を使用して点、線、面で構成される 3D グラフィックを描画する例_html5 チュートリアル スキル

WBOY
リリース: 2016-05-16 15:46:44
オリジナル
1995 人が閲覧しました

2、3 週間 Canvas で遊んでいますが、平面オブジェクトで遊ぶのは同じなので、3D をいじり始めました。

Canvas キャンバスは結局のところまだ平面なので、3D にしたい場合は Z 軸を抽象化する必要があります。次に、3D 座標を 2D 座標に変換し、キャンバス上に描画し、回転やその他の変形効果を使用して 3D 感を作成します。 3D を行うには、通常、点から線へ、そして線から面へという作業が伴います。

【ポイント】

クリックしていただければ、以前に 3D に関するブログ記事を書きました 3D タグ クラウドの解析は実際には非常に簡単です このブログ記事では div を使用して実装された 3D タグ クラウドについて説明していますが、根本的な原因は3D の原理も同じで、点から構成される最も単純な 3D です。各ラベルがポイントになります。このデモを直接見ることもできます:
2015512164236104.png (344×329)

3DBall
中には合計 500 個のポイント オブジェクトがあり、各ポイント オブジェクトは Z 軸に従ってサイズと透明度を変更し、球上に均等に分散します。点球。

【ライン】

点の作り方がわかれば、点と点を結ぶだけの簡単な線になります。これについてはデモを行っていませんが、実際には難しくありません。 moveTo をループしてから lineTo をループするだけで、ラインが出力されます。

【麺類】

このブログ記事は主に顔について話します。
早速、まずデモをやってみましょう:
2015512164305697.png (170×168)

3D キューブ

立方体を作成するために、点オブジェクト、面オブジェクト、立方体自体の 3 つのオブジェクトを使用しました。

以下は点オブジェクトです。x、y、z は点の 3 次元座標です。_get2d メソッドは 3 次元座標を 2 次元レベルに変換します。 fallLength は焦点距離です。

XML/HTML コードコンテンツをクリップボードにコピー
  1. var ベクトル = 関数(x,y,z){
  2. this.x = x;
  3. this.y = y;
  4. this.z
  5. = z; this._get2d
  6. =
  7. 関数(){ var scale
  8. =
  9. fallLength/(fallLength this.z); var x =
  10. centerX
  11. this.x*scale; var y = centerY
  12. this.y*scale;
  13. 戻り値 {x:x, y:y};


    次に対象ユーザー:

    面オブジェクトのプロパティページはわかりやすいです。面は正方形であり、v1v2v3v4 は面のレベルを表します。外側または内側。キャンバスで描画するときに、このサーフェスが前面に描画され、他のサーフェスで覆われないようにするには、これを [はい] にする必要があります。 zIndex の値も理解しやすいですが、これは頂点の平均 Z 軸座標であり、実際には中心点の Z 軸座標です。色はこの表面の色です。

    XML/HTML コードコンテンツをクリップボードにコピー
    1. var = function(vector1,vector2,vector3,vector4,color){
    2. this.v1 = vector1;   
    3. this.v2 = vector2;   
    4. this.v3 = vector3;   
    5. this.v4 = vector4;   
    6. this.color = 色;   
    7. this.zIndex = (this.v1.z this.v2.z this.v3.z this.v4.z)/4;   
    8. this.draw = function(){
    9. ctx.save();   
    10. ctx.beginPath();   
    11. ctx.moveTo(this.v1._get2d().x , this.v1._get2d().y);   
    12. ctx.lineTo(this.v2._get2d().x , this.v2._get2d().y);   
    13. ctx.lineTo(this.v3._get2d().x , this.v3._get2d().y);   
    14. ctx.lineTo(this.v4._get2d().x , this.v4._get2d().y);   
    15. ctx.closePath();   
    16. //ctx.fillStyle = "rgba(" parseInt(Math.random()*255) "," parseInt(Math.random()*255) "," parseInt(Math.random()*255) ",0.2)";   
    17. ctx.fillStyle = this.color;   
    18. ctx.fill();   
    19. }
    20. }


    最後は立方体本身对象:

    立方体が最後に回転するため、立方体オブジェクトの背面には面オブジェクトがなく、点回転後に面の回転が開始されます。length は立方体の長さ、_initVector は初期化された立方体の各頂点、_draw方法は、すべてのポイントが面を形成し、面のグループを配置し、その後面を並べ替え(つまり、面の zIndex に基づいて並べ替え)、並べ替えた後、各面の描画方法を調整することです。 🎜>

    XML/HTML コード
    复制コンテンツ到剪贴板
    1. var Cube = function(長さ){
    2. this.length = 長さ;   
    3. this.faces = [];   
    4. this.vectors = [];   
    5. }
    6. Cube.prototype = {
    7. _initVector:function(){
    8. this.vectors[0] = 新しい Vector(-this.length/2 , -this.length/2 , this.length/2);   
    9. this.vectors[1] = 新しい Vector(-this.length/2 , this.length/2 , this.length/2);    
    10. this.vectors[2] = 新しい Vector(this.length/2 , -this.length/2 , this.length/2);    
    11. this.vectors[3] = 新しい Vector(this.length/2 , this.length/2 , this.length/2);    
    12. this.vectors[4] = 新しい Vector(this.length/2 , -this.length/2 , -this.length/2);   
    13. this.vectors[5] = 新しい Vector(this.length/2 , this.length/2 , -this.length/2);   
    14. this.vectors[6] = 新しい Vector(-this.length/2 , -this.length/2 , -this.length/2);   
    15. this.vectors[7] = 新しい Vector(-this.length/2 , this.length/2 , -this.length/2);   
    16. },
    17. _draw:function(){
    18. this.faces[0] = new Face(this.vectors[0] , this.vectors[1] , this.vectors[3] , this.vectors[2] , "#6c6");   
    19. this.faces[1] = new Face(this.vectors[2] , this.vectors[3] , this.vectors[5] , this.vectors[4] , "#6cc");   
    20. this.faces[2] = new Face(this.vectors[4] , this.vectors[5] , this.vectors[7] , this.vectors[6] , "#cc6");   
    21. this.faces[3] = new Face(this.vectors[6] , this.vectors[7] , this.vectors[1] , this.vectors[0] , "#c6c");   
    22. this.faces[4] = new Face(this.vectors[1] , this.vectors[3] , this.vectors[5] , this.vectors[7] , "#666");   
    23. this.faces[5] = new Face(this.vectors[0] , this.vectors[2] , this.vectors[4] , this.vectors[6] , "#ccc");   
    24. this.faces.sort(function(a , b){
    25. return b.zIndex - a.zIndex;   
    26. });   
    27. this.faces.foreach(function(){
    28. this.draw();   
    29. })
    30. }
    31. }


    立方体の動作が完了すると、次に起動できるようになります。マウスの位置に応じて立方体の回転角度を変更します。rotateX およびrotateY の方法は、すべての点を X 軸および Y 軸を中心に回転します。当然のことながら、さらに理解したい場合は、X 軸および Y 軸を中心としたコンピューターの図形の 3D 変換を独自に検討することもできます。これには利点があり、本来は魔方を倒すために使用することを考えていますが、いくつかの問題に遭遇せず、問題は解決されません。

    およびrotateY の 2 つのメソッドは、各ポイントが次のフレームの位置を取得して、アニメーション サイクル中に繰り返し実行されます。
    XML/HTML コード复制コンテンツ到剪贴板
    1. if("addEventListener" in window){
    2. window.addEventListener("mousemove" , function(event){
    3. var x = event.clientX - canvas.offsetLeft - centerX;   
    4. var y = event.clientY - canvas.offsetTop - centerY;   
    5. 角度 Y = x*0.0001;   
    6. 角度X = y*0.0001;   
    7. });   
    8. }
    9. else {
    10. window.attachEvent("onmousemove" , function(event){
    11. var x = event.clientX - canvas.offsetLeft - centerX;   
    12. var y = event.clientY - canvas.offsetTop - centerY;   
    13. 角度 Y = x*0.0001;   
    14. 角度X = y*0.0001;   
    15. });   
    16. }  
    17. 関数 rotateX(ベクトル){
    18. var cos = Math.cos(angleX);   
    19. var sin = Math.sin(angleX);   
    20. vectors.foreach(function(){
    21. var y1 = this.y * cos - this.z * sin;   
    22. var z1 = this.z * cos this.y * sin;   
    23. this.y = y1;   
    24. this.z = z1;   
    25. });   
    26. }
    27. 関数 rotateY(ベクトル){
    28. var cos = Math.cos(angleY);   
    29. var sin = Math.sin(angleY);   
    30. vectors.foreach(function(){
    31. var x1 = this.x * cos - this.z * sin;   
    32. var z1 = this.z * cos this.x * sin;   
    33. this.x = x1;   
    34. this.z = z1;   
    35. })
    36. }  
    37. キューブ = 新しい Cube(80);   
    38. cube._initVector();   
    39. 関数 initAnimate(){
    40. cube._draw();   
    41. animate();   
    42. }
    43. 関数 animate(){
    44. ctx.clearRect(0,0,canvas.width,canvas.height)
    45. rotateY(cube.vectors);   
    46. rotateX(cube.vectors);   
    47. cube._draw();   
    48. if("requestAnimationFrame" in window){
    49. requestAnimationFrame(animate);   
    50. }
    51. else if("webkitRequestAnimationFrame" in window){
    52. webkitRequestAnimationFrame(animate);   
    53. }
    54. else if("msRequestAnimationFrame" in window){
    55. msRequestAnimationFrame(animate);   
    56. }
    57. else if("mozRequestAnimationFrame" in window){
    58. mozRequestAnimationFrame(animate);   
    59. }
    60. else {
    61. setTimeout(animate , 16);   
    62. }
    63. }


    すべてのコードは投稿しません。デモのコンソールから確認できます。他のフレームワークなどは参照していません。コピーするだけで使用できます。

    回転立方体を作成できたら、複数の回転立方体を作成することもできます。
    2015512164340019.png (484×463)

    ポケデモ: 顔: 3D Cube 2 3D Cube Line (顔なしのほうがかっこいいと思います)

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!