三维场景需要的最基础的构成

image.png最近写了几篇二维图形学的,今天来说下三维图像学的最基础的构成,先铺垫下哈,那么下面我们将使用 JavaScript 和 Three.js 来实现相关的代码来介绍三维场景需要的最基础的构成,包括三维空间中的坐标系、三维物体的建模、三维物体的变换和组合、以及简单的光照和阴影处理。

1. 三维坐标系

image.png
在三维空间中,我们需要使用三个轴来表示空间中的位置。通常情况下,我们使用右手坐标系来表示三维空间的坐标系,其中 �x 轴指向右侧,�y 轴指向上方,�z 轴指向观察者的前方。

在 Three.js 中,我们可以使用 THREE.Vector3 类来表示三维坐标系中的点,该类的构造函数接受三个参数,分别表示 �x、�y 和 �z 轴的坐标值。例如:

javascriptCopy Code




const point = new THREE.Vector3(1, 2, 3);

表示在三维空间中的 (1,2,3)(1,2,3) 点。

2. 三维物体的建模

在三维空间中,我们可以使用多边形网格来表示三维物体。多边形网格由多个三角形组成,每个三角形由三个顶点和三条边组成。

在 Three.js 中,我们可以使用 THREE.Geometry 类来表示三维物体,该类包含顶点数组和面数组,分别用于表示该物体的顶点和面。例如:

javascriptCopy Code




const geometry = new THREE.Geometry();

geometry.vertices.push(
    new THREE.Vector3(-1, -1, 0),
    new THREE.Vector3(1, -1, 0),
    new THREE.Vector3(0, 1, 0)
);

geometry.faces.push(new THREE.Face3(0, 1, 2));

表示一个三角形,其中三个顶点的坐标分别为 (−1,−1,0)(−1,−1,0)、(1,−1,0)(1,−1,0) 和 (0,1,0)(0,1,0)。

3. 三维物体的变换和组合

在三维空间中,我们可以对三维物体进行一系列变换,例如平移、旋转、缩放等。在 Three.js 中,我们可以使用 THREE.Matrix4 类来表示三维物体的变换矩阵,以实现相应的变换。

例如,要将一个物体沿着 �x 轴方向平移 1010 个单位长度,我们可以使用下面的代码:

javascriptCopy Code




const matrix = new THREE.Matrix4().makeTranslation(10, 0, 0);
geometry.applyMatrix(matrix);

该代码使用 THREE.Matrix4 类的 makeTranslation() 方法创建一个平移矩阵,然后使用 THREE.Geometry 类的 applyMatrix() 方法应用该矩阵,以实现平移操作。

类似地,我们可以使用 makeRotation()makeScale() 方法来创建旋转和缩放矩阵,以实现相应的变换。

除了单个物体的变换之外,我们还可以对多个物体进行组合操作。在 Three.js 中,我们可以使用 THREE.Group 类来将多个物体组合成为一个整体,并对整体进行变换操作。

例如,要将两个三角形沿着 �y 轴旋转 9090 度,我们可以使用下面的代码:

javascriptCopy Code




const group = new THREE.Group();
group.add(triangle1);
group.add(triangle2);


const matrix = new THREE.Matrix4().makeRotationY(Math.PI / 2);
group.applyMatrix(matrix);

该代码使用 THREE.Group 类的 add() 方法将两个三角形添加到一个组中,然后使用 THREE.Group 类的 applyMatrix() 方法将该组沿着 �y 轴旋转 9090 度。

4. 光照和阴影处理

在三维场景中,我们通常需要对光照和阴影进行处理,以增强场景的真实感。在 Three.js 中,我们可以使用 THREE.Light 类和 THREE.ShadowMap 类来实现相应的处理。

例如,要添加一个灯光到场景中,并启用阴影处理,我们可以使用下面的代码:

javascriptCopy Code




const light = new THREE.DirectionalLight(0xffffff, 1);
light.position.set(-1, 2, 4);
scene.add(light);


renderer.shadowMap.enabled = true;
renderer.shadowMap.type = THREE.PCFSoftShadowMap;

该代码创建了一个白色定向光,并设置其位置为 (−1,2,4)(−1,2,4)。然后使用 THREE.WebGLRenderer 类的 shadowMap 属性启用阴影处理,并设置阴影类型为软阴影。

5. 完整代码实现

接下来,我们将结合上述内容,给出完整的代码实现。该代码使用 Three.js 库来创建一个简单的三维场景,并显示在浏览器中。

htmlCopy Code
<!DOCTYPE html>
<html>
    <head>
        <title>3D Scene Basics</title>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <script src="https://cdn.jsdelivr.net/npm/three@0.132.0/build/three.min.js"></script>
    </head>
    <body>
        <script>
            // 创建场景、相机和渲染器
            const scene = new THREE.Scene();
            const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
            const renderer = new THREE.WebGLRenderer();
            renderer.setSize(window.innerWidth, window.innerHeight);
            document.body.appendChild(renderer.domElement);

            // 创建一个白色定向光,并设置其位置
            const light = new THREE.DirectionalLight(0xffffff, 1);
            light.position.set(-1, 2, 4);
            scene.add(light);

            // 启用阴影处理
            renderer.shadowMap.enabled = true;
            renderer.shadowMap.type = THREE.PCFSoftShadowMap;

            // 创建一个三角形
            const geometry = new THREE.Geometry();
            geometry.vertices.push(
                new THREE.Vector3(0, 1, 0),
                new THREE.Vector3(-1, -1, 0),
                new THREE.Vector3(1, -1, 0)
            );
            geometry.faces.push(new THREE.Face3(0, 1, 2));
            const material = new THREE.MeshBasicMaterial({color: 0xffffff});
            const triangle = new THREE.Mesh(geometry, material);
            triangle.position.y = 0.5;
            triangle.castShadow = true;
            scene.add(triangle);

            // 将场景向后移动一定距离,以便观察到物体
            camera.position.z = 5;

            // 循环渲染场景
            function animate() {
                requestAnimationFrame(animate);
                renderer.render(scene, camera);
            }
            animate();
        </script>
    </body>
</html>

上述代码将创建一个白色的三角形,并使用定向光对其进行照射,同时启用了阴影处理。

结语

本文介绍了三维场景需要的最基础的构成,包括三维坐标系、三维物体的建模、三维物体的变换和组合,以及简单的光照和阴影处理。通过使用 JavaScript 和 Three.js,我们可以轻松地实现这些操作,并创建出复杂而真实的三维场景。

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYjLViDu' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片