在二维 Canvas 中模拟三角形绕 X、Y 轴旋转

在 Web 前端绘图中,我们通常使用 Canvas 2D API 来绘制图形。Canvas 是二维的,无法直接进行三维建模和旋转。但如果我们希望一个简单的三角形能像 3D 物体一样「绕 X 轴翻转」或「绕 Y 轴旋转」,可以通过数学变换在 2D 平面里模拟这种效果。

本文将介绍实现思路,并给出 JavaScript 示例代码。


一、二维平面旋转 vs 三维旋转

在二维平面中,常见的旋转公式是 绕 Z 轴旋转

x=(x−cx)cosθ−(y−cy)sinθ+cx

y =(x−cx)sinθ+(y−cy)cosθ+cy

这只是平面内的转动。

但在三维空间中,还存在 绕 X 轴绕 Y 轴 的旋转:

  • X 轴:y 与 z 发生变化,看起来图形会「上下翻转」。
  • Y 轴:x 与 z 发生变化,看起来图形会「左右摇摆」。

由于 Canvas 是 2D 的,我们不能真正使用 z 坐标。但我们可以通过对 x 或 y 做 余弦缩放 来模拟这种效果。


二、核心数学思路

  1. 绕 X 轴旋转(上下翻转):

    • 在三维中,y 会随角度压缩或伸展。

    • 在二维里,我们可以这样近似:

      y′=(y−cy​)cosθ+cy​

  2. 绕 Y 轴旋转(左右摇摆):

    • 在三维中,x 会随角度压缩或伸展。

    • 在二维里,我们可以这样近似:

      x′=(x−cx​)cosθ+cx​

其中 (cx,cy) 是旋转中心点。


三、Canvas 实现代码

ini 复制代码
<canvas id="canvas" width="500" height="500"></canvas>
<script>
const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");

const w = canvas.width;
const h = canvas.height;

// 定义三角形
let triangle = [
  {x: 200, y: 200},
  {x: 300, y: 200},
  {x: 250, y: 100}
];

// 旋转中心(画布中心)
const cx = w / 2;
const cy = h / 2;

// 绕 X 轴旋转(模拟:改变 y)
function rotateX2D(p, angle) {
  return {
    x: p.x,
    y: (p.y - cy) * Math.cos(angle) + cy
  };
}

// 绕 Y 轴旋转(模拟:改变 x)
function rotateY2D(p, angle) {
  return {
    x: (p.x - cx) * Math.cos(angle) + cx,
    y: p.y
  };
}

// 绘制三角形
function drawTriangle(points) {
  ctx.beginPath();
  ctx.moveTo(points[0].x, points[0].y);
  ctx.lineTo(points[1].x, points[1].y);
  ctx.lineTo(points[2].x, points[2].y);
  ctx.closePath();
  ctx.fillStyle = "rgba(0,150,255,0.6)";
  ctx.fill();
  ctx.stroke();
}

let angleX = 0;
let angleY = 0;

function animate() {
  ctx.clearRect(0, 0, w, h);

  // 先绕 X 再绕 Y
  let rotated = triangle.map(p => rotateX2D(p, angleX));
  rotated = rotated.map(p => rotateY2D(p, angleY));

  drawTriangle(rotated);

  angleX += 0.02;  // 控制绕 X 旋转
  angleY += 0.015; // 控制绕 Y 旋转
  requestAnimationFrame(animate);
}

animate();
</script>

四、效果与扩展

运行后可以看到:

  • X 轴:三角形上下压缩,像是「翻书」。
  • Y 轴:三角形左右压缩,像是「开门」。
  • 两个叠加,就能产生类似 3D 物体的旋转感。

进一步扩展:

  • 可以改旋转中心为三角形重心,实现「绕自身旋转」。
  • 可以结合鼠标拖拽或键盘按键,动态控制旋转角度。
  • 可以给多个点应用同样的变换,实现更复杂的多边形或图形旋转。

五、总结

虽然 Canvas 2D 本身没有三维功能,但通过 余弦缩放 的方式,我们能在二维平面里模拟绕 X/Y 轴旋转的效果。这是一种简化的「伪 3D」方法,足以满足一些轻量级的动画和视觉效果需求。

如果需要更真实的 3D 效果,可以考虑使用 WebGL 或 Three.js 等三维引擎;但在学习和小型项目中,使用纯数学和 Canvas 就能实现有趣的旋转体验。

相关推荐
打小就很皮...6 分钟前
React 19 + Vite 6 + SWC 构建优化实践
前端·react.js·vite·swc
Highcharts.js8 分钟前
使用Highcharts与React集成 官网文档使用说明
前端·react.js·前端框架·react·highcharts·官方文档
这是个栗子8 分钟前
AI辅助编程(二) - 通译千问
前端·ai·通译千问
VT.馒头19 分钟前
【力扣】2625. 扁平化嵌套数组
前端·javascript·算法·leetcode·职场和发展·typescript
数研小生1 小时前
Full Analysis of Taobao Item Detail API taobao.item.get
java·服务器·前端
Shirley~~1 小时前
Vue-skills的中文文档
前端·人工智能
毎天要喝八杯水1 小时前
搭建vue前端后端环境
前端·javascript·vue.js
计算机程序设计小李同学2 小时前
幼儿园信息管理系统的设计与实现
前端·bootstrap·html·毕业设计
雨季6662 小时前
Flutter 三端应用实战:OpenHarmony “专注时光盒”——在碎片洪流中守护心流的数字容器
开发语言·前端·安全·flutter·交互
tao3556672 小时前
【用AI学前端】HTML-02-HTML 常用标签(基础)
前端·html