目录

项目搭建

初始化three.js基础代码

加载汽车模型

设置展厅效果

设置GUI面板动态控制车身操作

车门操作与车身视角展示

设置手动点击打开关闭车门

设置图片背景


今天简单实现一个three.js的小Demo,加强自己对three知识的掌握与学习,只有在项目中才能灵活将所学知识运用起来,话不多说直接开始。

项目搭建

本案例还是借助框架书写three项目,借用vite构建工具搭建vue项目,vite这个构建工具如果有不了解的朋友,可以参考我之前对其讲解的文章:vite脚手架的搭建与使用 。搭建完成之后,用编辑器打开该项目,在终端执行 npm i 安装一下依赖,安装完成之后终端在安装 npm i three 即可。

因为我搭建的是vue3项目,为了便于代码的可读性,所以我将three.js代码单独抽离放在一个组件当中,在App根组件中进入引入该组件。具体如下:

<template><!-- 3D汽车展厅 --><CarShowroom></CarShowroom>
</template><script setup>
import CarShowroom from './components/CarShowroom.vue';
</script><style lang="less">*{margin: 0;padding: 0;}
</style>

初始化three.js基础代码

three.js开启必须用到的基础代码如下:

导入three库

import * as THREE from 'three'

初始化场景

const scene = new THREE.Scene()

初始化相机

// 创建相机
const camera = new THREE.PerspectiveCamera(40,window.innerWidth / window.innerHeight,0.1,1000)
camera.position.set(4.25,1.4,-4.5)

初始化渲染器

// 创建渲染器
const renderer = new THREE.WebGLRenderer({ antialias: true })
renderer.setSize(window.innerWidth,window.innerHeight)
document.body.appendChild(renderer.domElement)

监听屏幕大小的改变,修改渲染器的宽高和相机的比例

window.addEventListener("resize",()=>{ renderer.setSize(window.innerWidth,window.innerHeight)camera.aspect = window.innerWidth/window.innerHeightcamera.updateProjectionMatrix()
})

导入轨道控制器

// 添加轨道控制器
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'
// 添加控制器
const controls = new OrbitControls(camera,renderer.domElement)
controls.enableDamping = true // 设置控制阻尼

设置渲染函数

// 设置渲染函数
const render = (time) =>{ controls.update()renderer.render(scene,camera)requestAnimationFrame(render)
}
render()

ok,写完基础代码之后,接下来开始具体的Demo实操。

加载汽车模型

通过使用模型加载器GLTFLoader,然后使用DRACOLoader加载Draco压缩过的模型可以显著减小模型文件体积,从而加快加载速度和提高用户体验。代码如下:

import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader";
import { DRACOLoader } from "three/examples/jsm/loaders/DRACOLoader";// 加载汽车模型
const loader = new GLTFLoader()
const dracoLoader = new DRACOLoader()
dracoLoader.setDecoderPath("/draco/")
loader.setDRACOLoader(dracoLoader)
loader.load("/public/model/Lamborghini.glb",(gltf)=>{scene.add(gltf.scene)
})

模型加载完成,画面如下:

因为没有灯光,所以我们需要给一个灯光让模型展现出来,这里设置一下环境光源:

// 设置环境光源
const ambientLight = new THREE.AmbientLight('#fff',0.5)
scene.add(ambientLight)

画面如下:

设置展厅效果

这里通过three库中自带的一些模型来实现展厅的效果,如下:

设置地板样式

// 设置地板样式
const floorGeometry = new THREE.PlaneGeometry(20,20)
const floormaterial = new THREE.MeshPhysicalMaterial({side: THREE.DoubleSide,color: 0x808080,metalness: 0, // 设置金属度roughness: 0.1, // 设置粗糙度wireframe: false // 关闭网格线
})
const mesh = new THREE.Mesh(floorGeometry,floormaterial)
mesh.rotation.x = Math.PI / 2
scene.add(mesh)

底部样式设置完,设置一个圆柱体将整个地板进行包裹:

// 设置圆柱体模拟展厅
const cylinder = new THREE.CylinderGeometry(12,12,20,32)
const cylindermaterial = new THREE.MeshPhysicalMaterial({color: 0x6c6c6c,side: THREE.DoubleSide
})
const cylinderMesh = new THREE.Mesh(cylinder,cylindermaterial)
scene.add(cylinderMesh)

接下来在圆柱体中设置一个聚光灯,让聚光灯偏垂直照射汽车模型,如下:

// 设置聚光灯(让汽车更具有立体金属感)
const spotLight = new THREE.SpotLight('#fff',2)
spotLight.angle = Math.PI / 8 // 散射角度,和水平线的夹角
spotLight.penumbra = 0.2 // 横向,聚光锥的半影衰减百分比
spotLight.decay = 2 // 纵向,沿着光照距离的衰减量
spotLight.distance = 30
spotLight.shadow.radius = 10
spotLight.shadow.mapSize.set(4096,4096)
spotLight.position.set(-5,10,1)
spotLight.target.position.set(0,0,0) // 光照射的方向
spotLight.castShadow = true
scene.add(spotLight)

为了不让展厅穿帮,这里将控制器的缩放以及旋转角度进行一个限制,让其只能在展厅中灵活查看而不能跑到展厅外面去:

controls.maxDistance = 10 // 最大缩放距离
controls.minDistance = 1 // 最小缩放距离
controls.minPolarAngle = 0 // 最小旋转角度
controls.maxPolarAngle = 85 / 360 * 2 * Math.PI // 最大旋转角度

设置GUI面板动态控制车身操作

这里我使用three.js库中自带的gui库,来动态的改变车身相关操作,因为我仅仅是控制车身材质和玻璃材质相关的数据操作,这里就线设置一下其相关的材质:

// 车身材质
let bodyMaterial = new THREE.MeshPhysicalMaterial({color: 'red',metalness: 1,roughness: 0.5,clearcoat: 1.0,clearcoatRoughness: 0.03
})
// 玻璃材质
let glassMaterial = new THREE.MeshPhysicalMaterial({color: '#793e3e',metalness: 0.25,roughness: 0,transmission: 1.0 // 透光性
})

在glb模型中,通过traverse函数遍历场景中的所有对象(包括Mesh、Group、Camera、Light等),并对这些对象进行相应操作或处理(这里的门操作后面会讲解到):

loader.load("/public/model/Lamborghini.glb",(gltf)=>{const carModel = gltf.scenecarModel.rotation.y = Math.PIcarModel.traverse((obj)=>{if(obj.name === 'Object_103' || obj.name === 'Object_64' || obj.name === 'Object_77'){// 车身obj.material = bodyMaterial}else if(obj.name === 'Object_90'){// 玻璃obj.material = glassMaterial}else if(obj.name === 'Empty001_16' || obj.name === 'Empty002_20'){// 门// doors.push(obj)}else{return true}})scene.add(gltf.scene)
})

最后得到的结果如下:

接下来通过控制面板来动态的监视汽车模型的车身和玻璃材质:

// 设置gui模板控制
// 修改默认面板名称
gui.domElement.parentNode.querySelector('.title').textContent = '3D汽车动态操作'const bodyChange = gui.addFolder("车身材质设置")
bodyChange.close() // 默认关闭状态
bodyChange.addColor(bodyMaterial,'color').name('车身颜色').onChange(value=>{bodyMaterial.color.set(value)
})
bodyChange.add(bodyMaterial,'metalness',0,1).name('金属度').onChange(value=>{bodyMaterial.metalness = value
})
bodyChange.add(bodyMaterial,'roughness',0,1).name('粗糙度').onChange(value=>{bodyMaterial.roughness = value
})
bodyChange.add(bodyMaterial,'clearcoat',0,1).name('清漆强度').onChange(value=>{bodyMaterial.clearcoat = value
})
bodyChange.add(bodyMaterial,'clearcoatRoughness',0,1).name('清漆层粗糙度').onChange(value=>{bodyMaterial.clearcoatRoughness = value
})
const glassChange = gui.addFolder("玻璃设置")
glassChange.close() // 默认关闭状态
glassChange.addColor(glassMaterial,'color').name('玻璃颜色').onChange(value=>{glassMaterial.color.set(value)
})
glassChange.add(glassMaterial,'metalness',0,1).name('金属度').onChange(value=>{glassMaterial.metalness = value
})
glassChange.add(glassMaterial,'roughness',0,1).name('粗糙度').onChange(value=>{glassMaterial.roughness = value
})
glassChange.add(glassMaterial,'transmission',0,1).name('透光性').onChange(value=>{glassMaterial.transmission = value
})

车门操作与车身视角展示

这里依然用GUI控制面板来动态实现开关车门以及车内车外视角动态切换的操作,如下:

var obj = { carRightOpen,carLeftOpen,carRightClose,carLeftClose,carIn,carOut }
// 设置车身动态操作
const doChange = gui.addFolder("车身动态操作设置")
doChange.close() // 默认关闭状态
doChange.add(obj, "carLeftOpen").name('打开左车门')
doChange.add(obj, "carRightOpen").name('打开右车门')
doChange.add(obj, "carLeftClose").name('关闭左车门')
doChange.add(obj, "carRightClose").name('关闭右车门')
doChange.add(obj, "carIn").name('车内视角')
doChange.add(obj, "carOut").name('车外视角')

每个操作都对应一个函数,如下:

// 打开左车门
const carLeftOpen = () => { setAnimationDoor({ x: 0 }, { x: Math.PI / 3 }, doors[1])
}
// 打开右车门
const carRightOpen = () => { setAnimationDoor({ x: 0 }, { x: Math.PI / 3 }, doors[0])
}
// 关闭左车门
const carLeftClose = () => { setAnimationDoor({ x: Math.PI / 3 }, { x: 0 }, doors[1])
}
// 关闭右车门
const carRightClose = () => { setAnimationDoor({ x: Math.PI / 3 }, { x: 0 }, doors[0])
}// 车内视角
const carIn = () => {setAnimationCamera({ cx: 4.25, cy: 1.4, cz: -4.5, ox: 0, oy: 0.5, oz: 0 }, { cx: -0.27, cy: 0.83, cz: 0.60, ox: 0, oy: 0.5, oz: -3 });
}
// 车外视角
const carOut = () => {setAnimationCamera({ cx: -0.27, cy: 0.83, cz: 0.6, ox: 0, oy: 0.5, oz: -3 }, { cx: 4.25, cy: 1.4, cz: -4.5, ox: 0, oy: 0.5, oz: 0 });
}

这里使用了补间动画tween.js,其github网址为 https://github.com/tweenjs/tween.js ,终端安装其第三方插件之后,直接引入即可,如下(这里不再过多介绍该库的使用,想学习的可以自行寻找其官方文档学习):

接下来借助tween.js库实现补间动画,如下:

// 设置补间动画
const setAnimationDoor = (start, end, mesh) => {const tween = new TWEEN.Tween(start).to(end, 1000).easing(TWEEN.Easing.Quadratic.Out)tween.onUpdate((that) => {mesh.rotation.x = that.x})tween.start()
}
const setAnimationCamera = (start, end) => {const tween = new TWEEN.Tween(start).to(end, 3000).easing(TWEEN.Easing.Quadratic.Out)tween.onUpdate((that) => {//  camera.postition  和 controls.target 一起使用camera.position.set(that.cx, that.cy, that.cz)controls.target.set(that.ox, that.oy, that.oz)})tween.start()
}

最终实现的效果如下:

点击查看车内视角的话,画面如下:

设置手动点击打开关闭车门

通过设置监听点击事件函数来动态实现打开关闭车门:

// 设置点击打开车门的动画效果
window.addEventListener('click', onPointClick);
function onPointClick(event) {let pointer = {}pointer.x = (event.clientX / window.innerWidth) * 2 - 1;pointer.y = - (event.clientY / window.innerHeight) * 2 + 1;var vector = new THREE.Vector2(pointer.x, pointer.y)var raycaster = new THREE.Raycaster()raycaster.setFromCamera(vector, camera)let intersects = raycaster.intersectObjects(scene.children);intersects.forEach((item) => {if (item.object.name === 'Object_64' || item.object.name === 'Object_77') {if (!carStatus || carStatus === 'close') {carLeftOpen()carRightOpen()} else {carLeftClose()carRightClose()}}})
}

然后给每个车门设置汽车状态,如下:

设置图片背景

为了让展厅更具有视觉效果,接下来设置一个画面背景让其更具有画面感,如下:

// 创建聚光灯函数
const createSpotlight = (color) => {const newObj = new THREE.SpotLight(color, 2);newObj.castShadow = true;newObj.angle = Math.PI / 6;;newObj.penumbra = 0.2;newObj.decay = 2;newObj.distance = 50;return newObj;
}// 设置图片背景
const spotLight1 = createSpotlight('#ffffff');
const texture = new THREE.TextureLoader().load('src/assets/imgs/奥特曼.jpg')
spotLight1.position.set(0, 3, 0);
spotLight1.target.position.set(-10, 3, 10)
spotLight1.map = texture
const lightHelper = new THREE.SpotLightHelper(spotLight1);
scene.add(spotLight1);

最终呈现的效果如下:

demo做完,给出本案例的完整代码:(获取素材也可以私信博主)

<script setup>
import * as THREE from "three"
import { ref, reactive } from 'vue'
// 添加轨道控制器
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader";
import { DRACOLoader } from "three/examples/jsm/loaders/DRACOLoader";
// 引入gui.js库
import { GUI } from 'three/examples/jsm/libs/lil-gui.module.min.js'
// 引入tween.js库
import * as TWEEN from '@tweenjs/tween.js'
// 实例化一个gui对象
const gui = new GUI()// 创建场景
const scene = new THREE.Scene()
// 创建相机
const camera = new THREE.PerspectiveCamera(40,window.innerWidth / window.innerHeight,0.1,1000)
camera.position.set(4.25,1.4,-4.5)
// 创建渲染器
const renderer = new THREE.WebGLRenderer({ antialias: true })
renderer.setSize(window.innerWidth,window.innerHeight)
renderer.shadowMap.enabled = true // 接收阴影
document.body.appendChild(renderer.domElement)// 添加控制器
const controls = new OrbitControls(camera,renderer.domElement)
controls.enableDamping = true // 设置控制阻尼
controls.maxDistance = 10 // 最大缩放距离
controls.minDistance = 1 // 最小缩放距离
controls.minPolarAngle = 0 // 最小旋转角度
controls.maxPolarAngle = 85 / 360 * 2 * Math.PI // 最大旋转角度// 监听页面变化
window.addEventListener("resize",()=>{ renderer.setSize(window.innerWidth,window.innerHeight)camera.aspect = window.innerWidth/window.innerHeightcamera.updateProjectionMatrix()
})// 车身材质
let bodyMaterial = new THREE.MeshPhysicalMaterial({color: 'red',metalness: 1,roughness: 0.5,clearcoat: 1.0,clearcoatRoughness: 0.03
})
// 玻璃材质
let glassMaterial = new THREE.MeshPhysicalMaterial({color: '#793e3e',metalness: 0.25,roughness: 0,transmission: 1.0 // 透光性
})// 设置门的集合
let doors = []
// 加载汽车模型
const loader = new GLTFLoader()
const dracoLoader = new DRACOLoader()
dracoLoader.setDecoderPath("/draco/")
loader.setDRACOLoader(dracoLoader)
loader.load("/public/model/Lamborghini.glb",(gltf)=>{const carModel = gltf.scenecarModel.rotation.y = Math.PIcarModel.traverse((obj)=>{if(obj.name === 'Object_103' || obj.name === 'Object_64' || obj.name === 'Object_77'){// 车身obj.material = bodyMaterial}else if(obj.name === 'Object_90'){// 玻璃obj.material = glassMaterial}else if(obj.name === 'Empty001_16' || obj.name === 'Empty002_20'){// 门doors.push(obj)}else{return true}// 车模型阴影obj.castShadow = true})scene.add(gltf.scene)
})// 设置环境光源
const ambientLight = new THREE.AmbientLight('#fff',0.5)
scene.add(ambientLight)// 设置地板样式
const floorGeometry = new THREE.PlaneGeometry(20,20)
const floormaterial = new THREE.MeshPhysicalMaterial({side: THREE.DoubleSide,color: 0x808080,metalness: 0, // 设置金属度roughness: 0.1, // 设置粗糙度wireframe: false // 关闭网格线
})
const mesh = new THREE.Mesh(floorGeometry,floormaterial)
mesh.rotation.x = Math.PI / 2
// mesh.receiveShadow = true // 接收阴影
scene.add(mesh)// 设置圆柱体模拟展厅
const cylinder = new THREE.CylinderGeometry(12,12,20,32)
const cylindermaterial = new THREE.MeshPhysicalMaterial({color: 0x6c6c6c,side: THREE.DoubleSide
})
const cylinderMesh = new THREE.Mesh(cylinder,cylindermaterial)
scene.add(cylinderMesh)// 设置聚光灯(让汽车更具有立体金属感)
const spotLight = new THREE.SpotLight('#fff',2)
spotLight.angle = Math.PI / 8 // 散射角度,和水平线的夹角
spotLight.penumbra = 0.2 // 横向,聚光锥的半影衰减百分比
spotLight.decay = 2 // 纵向,沿着光照距离的衰减量
spotLight.distance = 30
spotLight.shadow.radius = 10
spotLight.shadow.mapSize.set(4096,4096)
spotLight.position.set(-5,10,1)
spotLight.target.position.set(0,0,0) // 光照射的方向
spotLight.castShadow = true
scene.add(spotLight)// 设置gui模板控制
// 修改默认面板名称
gui.domElement.parentNode.querySelector('.title').textContent = '3D汽车动态操作'const bodyChange = gui.addFolder("车身材质设置")
bodyChange.close() // 默认关闭状态
bodyChange.addColor(bodyMaterial,'color').name('车身颜色').onChange(value=>{bodyMaterial.color.set(value)
})
bodyChange.add(bodyMaterial,'metalness',0,1).name('金属度').onChange(value=>{bodyMaterial.metalness = value
})
bodyChange.add(bodyMaterial,'roughness',0,1).name('粗糙度').onChange(value=>{bodyMaterial.roughness = value
})
bodyChange.add(bodyMaterial,'clearcoat',0,1).name('清漆强度').onChange(value=>{bodyMaterial.clearcoat = value
})
bodyChange.add(bodyMaterial,'clearcoatRoughness',0,1).name('清漆层粗糙度').onChange(value=>{bodyMaterial.clearcoatRoughness = value
})
const glassChange = gui.addFolder("玻璃设置")
glassChange.close() // 默认关闭状态
glassChange.addColor(glassMaterial,'color').name('玻璃颜色').onChange(value=>{glassMaterial.color.set(value)
})
glassChange.add(glassMaterial,'metalness',0,1).name('金属度').onChange(value=>{glassMaterial.metalness = value
})
glassChange.add(glassMaterial,'roughness',0,1).name('粗糙度').onChange(value=>{glassMaterial.roughness = value
})
glassChange.add(glassMaterial,'transmission',0,1).name('透光性').onChange(value=>{glassMaterial.transmission = value
})// 设置汽车状态
let carStatus;
// 打开左车门
const carLeftOpen = () => { carStatus = 'open'setAnimationDoor({ x: 0 }, { x: Math.PI / 3 }, doors[1])
}
// 打开右车门
const carRightOpen = () => { carStatus = 'open'setAnimationDoor({ x: 0 }, { x: Math.PI / 3 }, doors[0])
}
// 关闭左车门
const carLeftClose = () => { carStatus = 'close'setAnimationDoor({ x: Math.PI / 3 }, { x: 0 }, doors[1])
}
// 关闭右车门
const carRightClose = () => { carStatus = 'close'setAnimationDoor({ x: Math.PI / 3 }, { x: 0 }, doors[0])
}// 车内视角
const carIn = () => {setAnimationCamera({ cx: 4.25, cy: 1.4, cz: -4.5, ox: 0, oy: 0.5, oz: 0 }, { cx: -0.27, cy: 0.83, cz: 0.60, ox: 0, oy: 0.5, oz: -3 });
}
// 车外视角
const carOut = () => {setAnimationCamera({ cx: -0.27, cy: 0.83, cz: 0.6, ox: 0, oy: 0.5, oz: -3 }, { cx: 4.25, cy: 1.4, cz: -4.5, ox: 0, oy: 0.5, oz: 0 });
}var obj = { carRightOpen,carLeftOpen,carRightClose,carLeftClose,carIn,carOut }
// 设置车身动态操作
const doChange = gui.addFolder("车身动态操作设置")
doChange.close() // 默认关闭状态
doChange.add(obj, "carLeftOpen").name('打开左车门')
doChange.add(obj, "carRightOpen").name('打开右车门')
doChange.add(obj, "carLeftClose").name('关闭左车门')
doChange.add(obj, "carRightClose").name('关闭右车门')
doChange.add(obj, "carIn").name('车内视角')
doChange.add(obj, "carOut").name('车外视角')// 设置补间动画
const setAnimationDoor = (start, end, mesh) => {const tween = new TWEEN.Tween(start).to(end, 1000).easing(TWEEN.Easing.Quadratic.Out)tween.onUpdate((that) => {mesh.rotation.x = that.x})tween.start()
}
const setAnimationCamera = (start, end) => {const tween = new TWEEN.Tween(start).to(end, 3000).easing(TWEEN.Easing.Quadratic.Out)tween.onUpdate((that) => {//  camera.postition  和 controls.target 一起使用camera.position.set(that.cx, that.cy, that.cz)controls.target.set(that.ox, that.oy, that.oz)})tween.start()
}// 设置点击打开车门的动画效果
window.addEventListener('click', onPointClick);
function onPointClick(event) {let pointer = {}pointer.x = (event.clientX / window.innerWidth) * 2 - 1;pointer.y = - (event.clientY / window.innerHeight) * 2 + 1;var vector = new THREE.Vector2(pointer.x, pointer.y)var raycaster = new THREE.Raycaster()raycaster.setFromCamera(vector, camera)let intersects = raycaster.intersectObjects(scene.children);intersects.forEach((item) => {if (item.object.name === 'Object_64' || item.object.name === 'Object_77') {if (!carStatus || carStatus === 'close') {carLeftOpen()carRightOpen()} else {carLeftClose()carRightClose()}}})
}// 创建聚光灯函数
const createSpotlight = (color) => {const newObj = new THREE.SpotLight(color, 2);newObj.castShadow = true;newObj.angle = Math.PI / 6;;newObj.penumbra = 0.2;newObj.decay = 2;newObj.distance = 50;return newObj;
}// 设置图片背景
const spotLight1 = createSpotlight('#ffffff');
const texture = new THREE.TextureLoader().load('src/assets/imgs/奥特曼.jpg')
spotLight1.position.set(0, 3, 0);
spotLight1.target.position.set(-10, 3, 10)
spotLight1.map = texture
const lightHelper = new THREE.SpotLightHelper(spotLight1);
scene.add(spotLight1);// 设置渲染函数
const render = (time) =>{ controls.update()TWEEN.update(time)renderer.render(scene,camera)requestAnimationFrame(render)
}
render()
</script>

Three.js--》实现3D汽车展厅效果展示相关推荐

  1. 用原生JS实现3D轮播效果

    用原生JS实现3D轮播效果 实现思路: 先实现无缝轮播效果 添加3D效果 完善代码 增加自动轮播效果 效果如下: 视图中显示3张图片,并通过CSS的透视和旋转实现3D效果,当无任何操作时,图片自动循环 ...

  2. vue 项目使用three.js 实现3D看房效果

    0.前言 该教程能帮助直接写出vue项目的3D看房效果!!! 先上效果图 1.安装依赖 npm i three 2.vue代码 这里文件名为three.vue <template>< ...

  3. HTML+CSS+JS实现 ❤️3D万花筒图片相册展示特效❤️

    效果演示: 文末获取源码 代码目录: 主要代码实现: HTML代码 : <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitiona ...

  4. html js 动画效果,原生js html5 canvas 3D云动画效果

    特效描述:原生js html5canvas 3D云动画效果.3D云效果,叼炸天!可用鼠标控制方向!本地要localhost才能正常演示 代码结构 1. 引入JS 2. HTML代码 varying v ...

  5. 2天赚了4个W,手把手教你用Threejs搭建一个Web3D汽车展厅 | 大帅老猿threejs特训

    前言 事情是这样的,前段时间外包工头老杨又来找我了,说某汽车大品牌要开发一个网页展厅,希望可以在网页里360度展示它家新款汽车的3d模型,还要可以让用户DIY汽车部件的颜色. image.png 可能 ...

  6. 使用webgl(three.js)搭建3D智慧园区、3D大屏,3D楼宇,智慧灯杆三维展示,3D灯杆,web版3D,bim管理系统——第六课...

    前言: 今年是建国70周年,爱国热情异常的高涨,为自己身在如此安全.蓬勃发展的国家深感自豪. 我们公司楼下为庆祝国庆,拉了这样的标语,每个人做好一件事,就组成了我们强大的祖国. 看到这句话,深有感触, ...

  7. three.js实现3D模型展示

    开头说明下  文章是转载我同事一个 哥们的.怕自己 以后会用 拿过来  方便以后使用 three.js实现3D模型展示 由于项目需要展示3d模型,所以对three做了点研究,分享出来 希望能帮到大家 ...

  8. php 3d animation,CSS_纯CSS实现菜单、导航栏的3D翻转动画效果,我曾经向大家展示过闪光的logo - phpStudy...

    纯CSS实现菜单.导航栏的3D翻转动画效果 我曾经向大家展示过闪光的logo,燃烧的火狐狸,多重嵌套动画等例子,今天,我们将要制作一个简单但非常酷的3D翻转菜单.大家可以先看看实际效果,下面有效果截图 ...

  9. [Unity3d]虚拟3D汽车展示项目

    今天完善成了虚拟3D汽车展示项目的部分功能,虽然用的汽车模型有点粗糙,但感觉还不错,下面我就贴下源码供初学者学习! 项目展示地址:http://114.92.242.208/aspnet_client ...

最新文章

  1. java map 教程_Java Map接口
  2. Auto-Scaling Web Applications in Clouds: A Taxonomy and Survey读书笔记
  3. Xcode9 之 Xcode Server 持续集成
  4. monk js_对象检测-使用Monk AI进行文档布局分析
  5. Selenium介绍
  6. js逻辑训练题_七彩思维逻辑魔盘:全方面锻炼孩子的数学与逻辑思维
  7. 视力差,不要怕!PNAS:服用超长链多不饱和脂肪酸可显著改善视觉和视网膜功能!...
  8. 接口、抽象类、类之间的关系
  9. 下方向键_求助:Deepin-linux-opencv方向键
  10. Centos5.11 //IP/phpmyadmin 远程无法登入
  11. 删除“ie8左侧收藏夹图标(黄星星)”及“恢复”的方法
  12. Spring 源码分析(三) —— AOP(二)Spring AOP 整体架构
  13. 2016.01.10 论文扩充、精修、查重
  14. 陶哲轩实分析 定理 13.4.6
  15. 智能门锁主流品牌有哪些?选购门锁时要注重产品的哪些特性?
  16. [iOS]苹果开发证书 一个证书多人开发 注意项
  17. Photoshop抠头发丝超简单方法 PS抠头发
  18. 学习突围3 - 关于精力
  19. QQ电脑版修改聊天界面的显示比例后变成纯文本界面
  20. putty连接失败的超完整解决方案

热门文章

  1. Catalan Square
  2. eggjs中使用jwt
  3. Ubuntu开启SMB服务,Windows无法对硬盘读写
  4. java实验报告共享单车_java毕业设计_共享单车监管系统
  5. java fgc时间过长_elasticsearch 一次长时间 FGC 问题分析
  6. deep features for text spotting 在windows上使用
  7. 笔记本拆c面_细节处理不错 VAIO S13笔记本拆机解析
  8. Java语言基础(Java自我进阶笔记二)
  9. Java的一维数组详解
  10. 安装kuboard-kubernetes图形化管理工具