three.js浅谈@相机

相机的种类

上一节我们了解了threejs绘制一个场景的过程,这一节我们来认识以下什么是相机
相机分为4种

  1. 透视相机(PerspectiveCamera)
  2. 正交相机(OrthographicCamera)
  3. 全景相机(CubeCamera)
  4. 3D相机(StereoCamera)

其中最常用的是透视相机和正交相机

透视相机

image.png

透视相机的视口大约是这样子,相同尺寸的模型在远处的视角会比近处的视角小,因此看上去也会更小

image.png
image.png

以上是一个模型在距离近面100和1000的时候的场景,很明显,远处模型显得更小,这种相机符合人眼的数视觉规律

正交相机

image.png

正交相机的视口长这样,他没有视角的概念,因此不管距离远近只要是相同的模型大小都会是一样的


z轴距离100和1000都是这样大小

全景相机

全景相机也称为立方体相机,其本质是一个立方体的模型,在6个面的方向上面都安装了一个透视相机,
这种相机的作用可以用来做反射比如镜子


image.png

背对着我们的是我们使用的模型,面对我们的其实并非模型而是全景相机采集到的图像纹理贴到了一个立方体上面

const cubeCamera = new THREE.CubeCamera(0.1,10000,2048)
const material = new THREE.MeshBasicMaterial({
    envMap:cubeCamera.renderTarget.texture,//全景相机的像贴图成环境纹理
});
const mirrorMetry = new THREE.BoxGeometry( 10000, 10000, 0 )
const mirror = new THREE.Mesh( mirrorMetry, material )
scene.add( mirror )
scene.add( cubeCamera )
cubeCamera.updateCubeMap( renderer, scene )
renderer.render(scene, camera);//开始渲染

以上就是关键代码

3D相机

这个是2个透视相机的组合,2个相机之间有一定的距离,模拟人眼,可以得到2个稍有不同的像,这样2个想叠加起来可以做成3D视图,可以参考现在的3D电影的做法
光源

参考代码

import objloader from './objloader.js'
import axios from 'axios'
const THREE= window.THREE=require('three')
THREE.OBJLoader = objloader();
const scene = new THREE.Scene();//创建一个场景
/**
 * [camera 这是一个透视相机]
 * 参数:
 * fov:相机垂直视角大小
 * aspect:相机水平视角和垂直视角比值,一般设置为场景大小的比值,不然会造成拉伸
 * near:近端距离
 * far:远端距离
 */
const camera = new THREE.PerspectiveCamera(70, window.innerWidth/window.innerHeight, 0.1, 10000)
/**
 * left:左端距离
 * right:右端距离
 * top:顶端距离
 * bottom:底端距离
 * near:近端距离
 * far:远端距离
 * 值得注意的是各种上下和左右的比值要和场景的比值一致,不然会造成拉伸
 */
//const camera = new THREE.OrthographicCamera(window.innerWidth/-2, window.innerWidth/2,window.innerHeight/2,window.innerHeight/-2, 0.1, 10000)
camera.position.z=150
camera.position.x=150
camera.position.y=10
camera.lookAt({x:0,y:0,z:-1500})
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
//创建一个环境光:白色,强度:1
const light = new THREE.AmbientLight( '#fff',1);

const cubeCamera = new THREE.CubeCamera(0.1,10000,2048)
const mirrorMetry = new THREE.BoxGeometry( 10000, 10000, 0 );
const material = new THREE.MeshBasicMaterial({
    envMap:cubeCamera.renderTarget.texture,
});
const mirror = new THREE.Mesh( mirrorMetry, material );

cubeCamera.position.z = -150
mirror.position.z=cubeCamera.position.z
mirror.position.y=100
scene.add(light)//场景中加入光源
scene.add( camera )
scene.add( mirror )
scene.add( cubeCamera )

let texture = new THREE.Texture()

Promise.all([loadObj('../lib/lux6.obj'),loadImage('../lib/lux6.jpg')]).then(res=>{
        texture.image = res[1];  
        //纹理在创建后发生了改变(由上一语句引发),必须设置needsUpdate属性为true  
        texture.needsUpdate = true;  
        let obj = res[0]; 
        obj.traverse(child=>{
            if (child instanceof THREE.Mesh) {  
                child.material.map = texture;  
            } 
        })
        obj.position.y=-100
        //obj.rotateY(Math.PI/2)
        //obj.rotateZ ( -Math.PI/2 )
        scene.add(obj)
        cubeCamera.updateCubeMap( renderer, scene );
        renderer.render(scene, camera);//开始渲染
})

function loadObj(url){
    return new Promise(resolve=>{
        new THREE.OBJLoader().load(url, resolve)
    })
}
function loadImage(url) {  
    return new Promise(function (resolve) {  
        new THREE.ImageLoader().load(url, resolve)
    })
} 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容

  • 1 CALayer IOS SDK详解之CALayer(一) http://doc.okbase.net/Hell...
    Kevin_Junbaozi阅读 5,119评论 3 23
  • 转载自VR设计云课堂[https://www.jianshu.com/u/c7ffdc4b379e]Unity S...
    水月凡阅读 1,006评论 0 0
  • 本文主要是讲解 Three.js 的相关概念,帮助大家对 Three.js 以及相关知识形成比较完整的理解。今年来...
    Simon王小白阅读 8,430评论 2 9
  • 从学生转变为职场人的第一天,收获满满。原本有些忐忑的心在接触了nice的领导和伙伴们之后慢慢平静,只剩下期待了。今...
    Tiffany哦阅读 291评论 4 5
  • 听语音学习瑞安话 文章开始之前 先给大家猜一个谜语 ▼ 奇怪奇怪真奇怪 皮肤外面生骨头 胡须生在牙齿底 帽还带在股...
    云江之声阅读 477评论 0 0