图形学与坐标系入门教学

在计算机图形学的世界里,坐标系是构建和操作图形的基础。无论是绘制简单的线条、复杂的三维模型,还是实现炫酷的动画效果,都离不开对坐标系的理解和运用。接下来,我们将深入探讨图形学中常见的坐标系以及如何使用 JavaScript 进行相关操作。

一、常见坐标系介绍

1. 笛卡尔坐标系

笛卡尔坐标系是最基础也是最常用的坐标系。它由三条相互垂直的轴组成:X 轴、Y 轴和 Z 轴。在二维平面中,只需要 X 轴和 Y 轴就可以确定一个点的位置。X 轴通常表示水平方向,向右为正方向;Y 轴表示垂直方向,向上为正方向。在三维空间中,Z 轴垂直于 XY 平面,向前为正方向。

例如,在二维笛卡尔坐标系中,点 (3, 4) 表示在 X 轴正方向距离原点 3 个单位,在 Y 轴正方向距离原点 4 个单位的位置。

2. 屏幕坐标系

屏幕坐标系是计算机图形学中针对屏幕显示的坐标系。与笛卡尔坐标系不同,屏幕坐标系的原点通常位于屏幕的左上角,X 轴向右为正方向,Y 轴向下为正方向。这是因为计算机屏幕是从左上角开始逐行扫描显示内容的。

在屏幕坐标系中,假设屏幕宽度为 800 像素,高度为 600 像素,那么屏幕右下角的坐标就是 (799, 599) 。

3. 局部坐标系与世界坐标系

  • 局部坐标系:也称为物体坐标系,是为每个物体单独定义的坐标系。在局部坐标系中定义物体的形状和位置,方便对物体进行独立的操作和变换。例如,绘制一个正方形,我们可以在它的局部坐标系中定义四个顶点的坐标。
  • 世界坐标系:是一个全局的坐标系,用于将所有物体统一到一个空间中。当我们需要将多个物体组合在一起时,就需要将它们从局部坐标系转换到世界坐标系下。

二、使用 JavaScript 进行图形绘制与坐标系操作

在 JavaScript 中,我们可以使用canvas元素来进行图形绘制,下面通过一些示例来展示如何结合坐标系进行操作。

1. 基础绘制

首先,创建一个canvas元素,并获取其上下文对象:

js 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Canvas Graphics</title>
</head>
<body>
  <canvas id="myCanvas" width="400" height="400"></canvas>
  <script>
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
  </script>
</body>
</html>

接下来,在屏幕坐标系下绘制一个矩形:

js 复制代码
ctx.fillStyle ='red';
ctx.fillRect(50, 50, 100, 80);

这里的fillRect方法接收四个参数,分别是矩形左上角在屏幕坐标系中的 X 坐标、Y 坐标,以及矩形的宽度和高度。上述代码会在距离屏幕左边缘 50 像素,距离上边缘 50 像素的位置,绘制一个宽 100 像素,高 80 像素的红色矩形。

2. 坐标变换

在图形学中,经常需要对图形进行平移、旋转、缩放等变换操作,这些操作本质上是对坐标系的变换。

平移变换

使用translate方法可以实现平移操作:

js 复制代码
ctx.translate(100, 100);
ctx.fillStyle = 'blue';
ctx.fillRect(0, 0, 100, 80);

这里先将坐标系的原点平移到 (100, 100) 的位置,然后在新的坐标系下,以 (0, 0) 为左上角坐标绘制一个蓝色矩形。实际上,这个蓝色矩形在原来的屏幕坐标系中的位置是 (100, 100)。

旋转变换

使用rotate方法可以实现旋转操作,参数为旋转的弧度:

js 复制代码
ctx.translate(200, 200);
ctx.rotate(Math.PI / 4);
ctx.fillStyle = 'green';
ctx.fillRect(-50, -40, 100, 80);

上述代码先将坐标系原点平移到 (200, 200),然后将坐标系顺时针旋转 45 度(Math.PI / 4弧度),最后绘制一个绿色矩形。由于坐标系发生了旋转,矩形也会跟着旋转。

缩放变换

使用scale方法可以实现缩放操作:

js 复制代码
ctx.translate(300, 300);
ctx.scale(2, 0.5);
ctx.fillStyle = 'purple';
ctx.fillRect(0, 0, 50, 80);

这里将坐标系原点平移到 (300, 300),然后在 X 方向上放大 2 倍,在 Y 方向上缩小为原来的 0.5 倍,最后绘制紫色矩形。原本宽 50 像素、高 80 像素的矩形,在变换后宽度变为 100 像素,高度变为 40 像素 。

三、坐标系转换

在实际应用中,常常需要在不同坐标系之间进行转换。例如,从局部坐标系转换到世界坐标系,或者从世界坐标系转换到屏幕坐标系进行显示。

假设我们有一个物体在局部坐标系下的顶点坐标,要将其转换到世界坐标系下,可以通过一系列的矩阵变换来实现。虽然 JavaScript 中没有直接的矩阵运算类,但我们可以通过数组来模拟矩阵,并编写相应的函数来进行矩阵乘法等操作。以下是一个简单的二维矩阵变换示例:

js 复制代码
// 定义二维矩阵乘法函数
function matrixMultiply(a, b) {
  const result = [[0, 0], [0, 0]];
  for (let i = 0; i < 2; i++) {
    for (let j = 0; j < 2; j++) {
      for (let k = 0; k < 2; k++) {
        result[i][j] += a[i][k] * b[k][j];
      }
    }
  }
  return result;
}
// 定义平移矩阵
function createTranslationMatrix(tx, ty) {
  return [[1, 0, tx], [0, 1, ty], [0, 0, 1]];
}
// 定义一个点在局部坐标系下的坐标
const localPoint = [1, 1, 1];
const translationMatrix = createTranslationMatrix(50, 50);
// 进行坐标转换
const worldPoint = [];
for (let i = 0; i < 3; i++) {
  let sum = 0;
  for (let j = 0; j < 3; j++) {
    sum += translationMatrix[i][j] * localPoint[j];
  }
  worldPoint.push(sum);
}
console.log(worldPoint); 

上述代码定义了矩阵乘法函数和创建平移矩阵的函数,通过将局部坐标系下的点与平移矩阵相乘,得到了该点在世界坐标系下的坐标。

通过以上内容,我们对图形学中的坐标系以及如何使用 JavaScript 进行相关操作有了一定的了解。在实际开发中,还会涉及到更复杂的坐标系转换和图形操作,但只要掌握了这些基础知识,就能更好地理解和处理图形学相关的问题。

相关推荐
brzhang几秒前
告别『上线裸奔』!一文带你配齐生产级 Web 应用的 10 大核心组件
前端·后端·架构
程序员Bears几秒前
深入理解CSS3:Flex/Grid布局、动画与媒体查询实战指南
前端·css3·媒体·visual studio code
工呈士7 分钟前
CSS in JS:机遇与挑战的思考
javascript·css
至尊童9 分钟前
五个JavaScript 应用技巧
javascript
David凉宸12 分钟前
凉宸推荐给大家的一些开源项目
前端
举个栗子dhy14 分钟前
编辑器、代码块、大模型AI对话中代码复制功能实现
javascript
袋鱼不重14 分钟前
Cursor 最简易上手体验:谷歌浏览器插件开发3s搞定!
前端·后端·cursor
hyyyyy!15 分钟前
《从分遗产说起:JS 原型与继承详解》
前端·javascript·原型模式
竹苓15 分钟前
从一个想法到上线,一万字记录我开发浏览器插件的全过程
前端
小桥风满袖16 分钟前
Three.js-硬要自学系列19 (曲线颜色渐变、渐变插值、查看设置gltf顶点、山脉高度可视化)
前端·css·three.js