three.js入门第一个案例

准备工作

1.运用three.js进行3d开发,其实和页面编程一样,首先需要在html文件中引入three.js。Three.js使用面向对象的方式来构建程序,它包含3个基本对象: 场景(scene), 相机(camera), 以及一个渲染器(renderer)。

第一步: 引入three.js.

    <!DOCTYPE html>
    <html>
        <head>
    <meta charset=utf-8>
    <title>My first Three.js app</title>
        </head>
        <body>
    <script src="https://cdn.bootcss.com/three.js/r83/three.min.js"></script>
    <script>
        // 这个位置是留给后面初始化和开发3d页面的js代码
    </script>
        </body>
    </html> 

第二步: 用js代码创建3D场景(scene),非常简单就一行代码.

      let scene = new THREE.Scene();

第三步:用js代码创建相机(camera),再确定其位置,下面代码也就两行,但是多了参数。来说明一下参数的作用:

    //fov 代表视角 我们观察位置的视觉
    //aspect 宽高比 简单理解为确定3d页面的宽和高
    //near 最近看到 滚轮缩放的最小距离
    //far 最远看到 滚轮缩放的最大距离
    let camera = PerspectiveCamera( fov, aspect, near, far );
    camera.position.set( x, y,z);//x:水平方向位置, y: 竖直方向位置,z:垂直屏幕方向位置

一般给下面这组值来确定相机能够看得的位置:

        let camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );
        camera.position.set( 0, 100,300 );

第四步:用js代码创建渲染器(renderer),设置渲染页面大小,一般为相机确定的3d页面大小,最后一行是把渲染器加入页面.

        let renderer = new THREE.WebGLRenderer();
        renderer.setSize( window.innerWidth, window.innerHeight );
        document.body.appendChild(renderer.domElement );

第五步:给3d页面添加一个白色环境光这样我们才能够看见物体:

    //环境光
? ? let ambientLight = new THREE.AmbientLight( 0xf5f5f5);//创建光
    scene.add( ambientLight );//加入到场景

最后一步:开始时刻渲染3d页面,虽然完成了最后一步,但是运行代码后我们还是不能看见任何东西,那是因为我们只渲染了3d页面,并没有添加事物到页面,接下来我们就来添加一个球吧:

    function render() {
        requestAnimationFrame( render );
        renderer.render( scene, camera );
    }
    render();

添加个球吧,添加了下面代码再运行下发现3d页面上有一个红色的球了,但是我们不能用鼠标来控制它,那是因为three.js里面没有来写鼠标的控制3d页面,我们还需要引入鼠标控制插件OrbitControls.js。

    let ball= new THREE.SphereGeometry( 5, 32, 32 );//创建球
    let ballColor= new THREE.MeshBasicMaterial( {color: 0xffff00} );//创建材质色,用来给球上色的
    let sphere = new THREE.Mesh( ball, ballColor);//给球上色
    scene.add( sphere );//把球加入到场景
再添加格子辅助线方便我们观察和调整物体位置:
    let grid = new THREE.GridHelper( 400, 30, 0xcccccc, 0xcccccc );//创建辅助线
    scene.add( grid );//加入场景

引入OrbitControls.js,然后初始化控件,在运行页面发现可以用鼠标来控制这个球了,就问你完不完美,beautiful 不 beautiful,下次我们再讲如何来设置光;

    <script src="/libs/OrbitControls.js"></script>

    let controls =newTHREE.OrbitControls(camera);
    //通过.enableZoom属性可以控制是否允许鼠标中键缩放场景,.enableZoom属性默认值true。
    controls.enableZoom =true;//允许缩放`
    controls.minDistance = 1;//能够缩放多小
    controls.maxDistance = 2000;////能够放大多大

    //通过.enableRotate属性可以控制是否允许鼠标左键旋转场景,.enableRotate属性默认值true。
    controls.enableRotate =true;//允许旋转

最终代码:运行一下,查看效果

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset=utf-8>
        <title>demo1</title>
    </head>
    <body>
        <script src="lib/three.min.js"></script>
        <script src="lib/OrbitControls.js"></script>
        <script>
            // 这个位置是留给后面初始化和开发3d页面的js代码
            let scene = new THREE.Scene();
            let camera = new THREE.PerspectiveCamera( 70, window.innerWidth / window.innerHeight, 0.1, 2000 );
            camera.position.set( 0, 50,300 );? ?
            let renderer = new THREE.WebGLRenderer();
            renderer.setSize( window.innerWidth, window.innerHeight );
            document.body.appendChild(renderer.domElement );
            // 给场景添加一个环境光
? ?         let ambientLight = new THREE.AmbientLight( 0xf5f5f5);
            scene.add( ambientLight );
            let grid = new THREE.GridHelper( 400, 30, 0xcccccc, 0xcccccc );
            scene.add( grid );
            let ball = new THREE.SphereGeometry( 5, 32, 32 );//5:球半径 第一个32:水平分割面的数量. 第二个32:垂直分割面的数量.
            let ballColor = new THREE.MeshBasicMaterial( { color: 0xff0000 } );
            let cube = new THREE.Mesh( ball , ballColor );
            scene.add( cube );
            let controls =new THREE.OrbitControls(camera, renderer.domElement);
            controls.enableZoom =true;//允许缩放
            //设置相机移动距离
            controls.minDistance = 1;
            controls.maxDistance = 2000;
            controls.enableRotate =true;
            function render() {
                requestAnimationFrame( render );
                renderer.render( scene, camera );
            }
            render();
        </script>
</body>
</html>

three.js的中文文档踏得网

原文地址:https://www.cnblogs.com/lmf-sky/p/12187733.html

时间: 2024-11-06 19:50:00

three.js入门第一个案例的相关文章

js 入门 第一章

<script src="kaishixuexi.js"></script>       这是一个引人方式 <script > var a="大树"; var b=11; var c=5; var d="女朋友"; var e="绿了"; // alert("我是一颗"+a+",长出了"+b+"树枝.我有一个"+d+",到

【 D3.js 入门系列 --- 1 】 第一个程序HelloWorld

本人的个人博客首页为: http://www.ourd3js.com/  .csdn博客首页为:http://blog.csdn.net/lzhlzz/.转载请注明出处.谢谢. 以下開始用D3.js处理第一个简单问题,先看以下的代码: <html> <head> <meta charset="utf-8"> <title>HelloWorld</title> </head> <body> <p&g

Node.js入门:包结构

JavaScript缺少包结构.CommonJS致力于改变这种现状,于是定义了包的结构规范(http://wiki.commonjs.org/wiki/Packages/1.0 ).而NPM的出现则是为了在CommonJS规范的基础上,实现解决包的安装卸载,依赖管理,版本管理等问题.require的查找机制明了之后,我们来看一下包的细节. 一个符合CommonJS规范的包应该是如下这种结构: 一个package.json文件应该存在于包顶级目录下 二进制文件应该包含在bin目录下. JavaSc

学习ExtjsForVs(第一个案例HelloWord)

第一个案例-Hello Word 1.本次练习以ext-4.0.7为例,首先从网上下载ext包. 2.打开包后将里面的三个文件或文件夹拷贝到项目中. resource文件夹 bootstrap.js ext-all.js 3. 在First-Hello.html中构建如下代码 1 <!DOCTYPE html> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <meta http

EasyUI入门第一课

首先下载easyUI,最好是最新的,然后新建一个空web程序或是网站,不废话,代码如下: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="JqueryEasyUI.WebForm1" %> <!DOCTYPE html> <html xmlns="http://ww

Node.js入门:前后端模块的异同

通常有一些模块可以同时适用于前后端,但是在浏览器端通过script标签的载入JavaScript文件的方式与Node.js不同.Node.js在载入到最终的执行中,进行了包装,使得每个文件中的变量天然的形成在一个闭包之中,不会污染全局变量.而浏览器端则通常是裸露的JavaScript代码片段.所以为了解决前后端一致性的问题,类库开发者需要将类库代码包装在一个闭包内.以下代码片段抽取自著名类库underscore的定义方式. 1 (function () { 2 // Establish the

Node.js入门:异步IO

异步IO 在操作系统中,程序运行的空间分为内核空间和用户空间.我们常常提起的异步I/O,其实质是用户空间中的程序不用依赖内核空间中的I/O操作实际完成,即可进行后续任务. 同步IO的并行模式 多线程单进程    多线程的设计之处就是为了在共享的程序空间中,实现并行处理任务,从而达到充分利用CPU的效果.多线程的缺点在于执行时上下文交换的开销较大,和状态同步(锁)的问题.同样它也使得程序的编写和调用复杂化. 单线程多进程 为了避免多线程造成的使用不便问题,有的语言选择了单线程保持调用简单化,采用启

Node.js入门:文件查找机制

文件查找流程图 从文件模块缓存中加载 尽管原生模块与文件模块的优先级不同,但是都不会优先于从文件模块的缓存中加载已经存在的模块. 从原生模块加载 原生模块的优先级仅次于文件模块缓存的优先级.require方法在解析文件名之后,优先检查模块是否在原生模块列表中.以http模块为例,尽管在目录下存在一个http/http.js/http.node/http.json文件,require("http")都不会从这些文件中加载,而是从原生模块中加载. 原生模块也有一个缓存区,同样也是优先从缓存

Ember.js入门教程、博文汇总

第一章 对象模型 Ember.js 入门指南——类的定义.初始化.继承 Ember.js 入门指南——类的扩展(reopen) Ember.js 入门指南——计算属性(compute properties) Ember.js 入门指南——观察者(observer) Ember.js 入门指南——绑定(bingding) Ember.js 入门指南——枚举(enumerables) Ember.js 入门指南之七第一章对象模型小结 第二章 模板 Ember.js 入门指南——handlebars基