53. Three.js案例-使用样条曲线绘制3D图形

53. Three.js案例-使用样条曲线绘制3D图形

实现效果

该案例使用Three.js创建了一个基于样条曲线的3D图形,并为其添加了纹理映射和线框盒。通过三角函数生成样条曲线上的点,然后利用这些点创建一个旋转体(Lathe
Geometry),并用指定的纹理贴图进行渲染。最后,为该旋转体添加了一个红色的线框盒,以展示其边界。

效果

知识点

WebGLRenderer

用于创建WebGL渲染器对象,它负责将场景中的所有元素渲染到页面上。

构造器

WebGLRenderer(parameters : Object)

参数类型描述
parametersObject渲染器配置参数,如抗锯齿设置等
  • antialias: 布尔值,默认为false。如果设置为true,则开启抗锯齿功能。
  • setClearColor(color: Color, alpha: Float):设置背景颜色和透明度。

Scene

表示场景,是所有物体、光源、相机等的容器。

const myScene = new THREE.Scene();

PerspectiveCamera

透视投影相机,模拟人眼观察世界的方式。

构造器

PerspectiveCamera(fov : Float, aspect : Float, near : Float, far : Float)

参数类型描述
fovFloat视野角度,单位为度
aspectFloat宽高比
nearFloat近裁剪面距离
farFloat远裁剪面距离
  • position.set(x: Float, y: Float, z: Float):设置相机位置。
  • lookAt(vector: Vector3):让相机看向指定坐标点。

LatheGeometry

根据二维轮廓线绕Y轴旋转生成三维几何体。

构造器

LatheGeometry(points : Array<Vector2>, segments : Integer)

参数类型描述
pointsArray一系列二维向量,定义了轮廓线上的点
segmentsInteger分割段数,决定了曲面平滑度

MeshBasicMaterial

一种基本材质,可以用来显示简单的几何形状。

属性
  • map: Texture类型,用于指定要应用的纹理图像。
  • side: 设置材质渲染面,默认只渲染正面,可选值有THREE.FrontSide, THREE.BackSide, THREE.DoubleSide

BoxHelper

用于创建一个包围给定对象的线框盒,便于调试或可视化对象的边界范围。

构造器

BoxHelper(object : Object3D, color : Color)

参数类型描述
objectObject3D要创建线框盒的对象
colorColor线框盒的颜色

代码

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <script src="ThreeJS/three.js"></script>
    <script src="ThreeJS/jquery.js"></script>
</head>
<body>
<center id="myContainer"></center>
<script>
    // 创建渲染器
    var myRenderer = new THREE.WebGLRenderer({antialias: true});
    myRenderer.setSize(window.innerWidth, window.innerHeight);
    myRenderer.setClearColor('white', 1.0);
    $("#myContainer").append(myRenderer.domElement);

    // 创建场景
    var myScene = new THREE.Scene();

    // 创建相机
    var myCamera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 30, 1000);
    myCamera.position.set(-172.94, -204.34, 194.46);
    myCamera.lookAt(new THREE.Vector3(0, 0, 0));

    // 根据三角函数设置样条曲线的点
    var myPoints = [];
    for (var i = 0; i < 90; i++) {
        myPoints.push(new THREE.Vector2(Math.sin(i * 0.2) * Math.sin(i * 0.1) * 15 + 50, (i - 5) * 2));
    }

    // 创建样条曲线图形
    var myGeometry = new THREE.LatheGeometry(myPoints, 400);
    var myMap = new THREE.TextureLoader().load("images/img002.jpg");
    var myMaterial = new THREE.MeshBasicMaterial({map: myMap, side: THREE.DoubleSide});
    var myMesh = new THREE.Mesh(myGeometry, myMaterial);
    myMesh.translateY(-70);
    myScene.add(myMesh);

    // 创建线框盒
    var myBox = new THREE.BoxHelper(myMesh, 'red');
    myScene.add(myBox);

    // 渲染
    function animate() {
        requestAnimationFrame(animate);
        myRenderer.render(myScene, myCamera);
    }

    animate();
</script>
</body>
</html>

演示链接

示例链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MossGrower

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值