THREEJS 笔记1 最基本的项目

2018-11-21  本文已影响0人  论宅

一个threeJS基础项目里面有的东西上文已经介绍:
https://www.zybuluo.com/mdeditor
至少存在正确版本的threeJS文件,摄像机,场景,基础物体,循环渲染方法,灯光——

//html 一个基础容器
<div id="container"></div>
// 引入jquery,threejs库文件
<script type="text/javascript" src="js/jquery-1.6.4.js"></script>
<script src="js/three-indomo.js"></script>

// 引入控制器,可以通过键盘或者鼠标手指的点击拖动达到环视场景内容的效果,每个控制器需要引入不同的控制器文件,这个控制器的效果是设定一个点,拖拽场景会使镜头以这个点为中心环绕显示。
<script type="text/javascript" src="js/OrbitControls.js"></script>

// css
body,
html {
    width: 100%;
    height: 100%;
}

* {
    margin: 0;
}

#container {
    border: 0;
    cursor: pointer;
    width: 100%;
    height: 100%;
    background: #ffffff;
}

// js
// 渲染器,threejs通过它循环渲染场景,原理便是通过requestAnimateFrame方法刷新内容
var renderer;

// 摄像机,即使是三维的场景,显示在屏幕上的也是一个二维的平面,而这个平面的内容就是通过摄像机确定的。平面的内容就是摄像机的视角。
var camera;

// 三维场景本身,所有物体必须添加到这个场景中才能显示出来。
var scene;

// 灯光,没有灯光场景自然就是一片漆黑,灯光类型多种,从光的强度到范围等等都可以设定。
var light;

// 控制器,用户可以通过控制器环视场景。
var controls;

// 初始化three场景
function initThree() {

    width = document.getElementById("container").clientWidth;
    height = document.getElementById("container").clientHeight;
    
    // 设定渲染器,有强力的WebGLRenderer和兼容性好的canvasRenderer两种
    renderer = new THREE.WebGLRenderer({
    // 抗锯齿参数:antialias
        antialias: true
    });
    
    // 设定容器宽高
    renderer.setPixelRatio(window.devicePixelRatio);
    renderer.setSize(window.innerWidth, window.innerHeight);

    console.log(window.innerWidth, window.innerHeight)
    
    // 启动影子系统,设定它是出现影子的前置,但是影子真的不好看,用图片再合适的地方摆一下可能会更好
    //renderer.shadowMapEnabled = false;
    //  renderer.setSize(width, height);
    document.getElementById('container').appendChild(renderer.domElement);
    
    // 设置背景颜色
    renderer.setClearColor(0xFFFFFF, 1.0);
}

// 初始化摄像头
function initCamera() {
    // 当然摄像头也是有多种的
    camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 1, 1000);
    
    // 设定社下头的位置
    camera.position.set(50, 50, 50);

    // 设置控制器,每个控制器参数都差不多,但是某些细节还是需要思索的
    controls = new THREE.OrbitControls(camera, renderer.domElement);
    controls.enableDamping = true; // an animation loop is required when either damping or auto-rotation are enabled
    controls.dampingFactor = 0.25;
    controls.screenSpacePanning = false;
    //controls.minDistance = 50;
    controls.maxDistance = 100

    controls.minPolarAngle = Math.PI / 12;
    controls.maxPolarAngle = Math.PI / 2.5;
    // 自动旋转
    controls.autoRotate = true;
    controls.autoRotateSpeed = 0.5

    //controls.maxPolarAngle = Math.PI;
    
    // 初始化时钟,计时器
    clock = new THREE.Clock();
}

// 初始化场景
function initScene() {
    scene = new THREE.Scene();
    
    // 场景有一个雾化属性,通过设定距离让远处的事物逐渐羽化
    scene.fog = new THREE.Fog(0xffffff, 200, 1300);
}

// 设定灯光
var sun1;

function initLight() {
// 设置直射灯
    sun1 = new THREE.DirectionalLight(0xffffff);
    sun1.position.set(-1000, 500, -1000);
    
    // 影子系统前置2,表示该灯光可以投影出影子了
    //sun1.castShadow = true;
    
    // 添加到场景中
    scene.add(sun1);

    sun2 = new THREE.DirectionalLight(0xffffff);
    sun2.position.set(1000, 500, 1000);
    //sun2.castShadow = true;
    scene.add(sun2);

}

function preload() {
    // 初始化renderer
    initThree();
    
    // 初始化摄像机(附带一个控制器)
    initCamera();
    
    // 初始化场景
    initScene();
    
    // 初始化灯光
    initLight();

}

function render() {
    
    // 的时间计时器
    var delta = clock.getDelta();
    controls.update(delta); //更新时间
    
    // renderer开始执行
    renderer.render(scene, camera);
    
    // renderer刷新完后利用帧事件接着执行自身方法
    requestAnimationFrame(render);
}

$(document).ready(function() {
    // 初始化three组件
    preload();
    
    // 开启render,开始渲染
    render();
    
    // 防止render未被执行时屏幕黑屏,先手动执行一次renderer
    renderer.render(scene, camera);
    
    // 简易天空图生成,只有在scene被初始化之后才可使用
    scene.background = new THREE.CubeTextureLoader()
        .setPath("assets/img/skybox/")
        .load(['px.jpg', 'nx.jpg', 'py.jpg', 'ny.jpg', 'pz.jpg', 'nz.jpg', ])

})
上一篇下一篇

猜你喜欢

热点阅读