日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Three开发笔记(二)

發布時間:2024/1/1 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Three开发笔记(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 1. 學習使用Three.js 中的光源
      • THREE. AmbientLight
      • THREE. Color
      • THREE. PointLight
      • THREE. SpotLight
      • THREE. DirectionalLisht
      • THREE. HemisphereLight
      • THREE. AreaLight
      • THREE. LensFlare
  • 2. 使用 Three.js 的材質
    • 分類
      • 基礎屬性 THREE. Material
      • 混合屬性
      • 高級屬性
      • MeshBaseMaterial
      • THREE. MeshDepthMaterial
      • 聯合材質
      • THREE. MeshNormalMaterial
      • THREE. MeshFaceMaterial
      • THREE. MeshPhongMaterial
      • THREE. ShaderMaterial 創建自己的著色器
      • THREE. LineBaseMaterial
      • THREE. LineDashMaterial

1. 學習使用Three.js 中的光源

不同種類的光源

名字描述
THREE. AmbientLight基本光源,該光源的顏色將會疊加到場景現有物體的顏色上
THREE. PointLight點光源,從空間的一個點向所有方向發射光線,點光源不能用來創建陰影
THREE. SpotLight光源有聚光的效果,類似臺燈、天花板上的吊燈或手電筒,這種光源可以投射陰影
THREE. DirectionalLIght無線光,光源發出的光線可以看作是平行,類似太陽光,可創建陰影
THREE. HemisphereLight特殊光源,可通過模擬反光面和光線微弱的天空來創建更加自然的室外光線,不提供陰影相關功能
THREE. AreaLight可指定散發光線的平面,不是一個點,不投射陰影
THREE. LensFlare不是光源,可為場景中的光源家鏡頭光暈效果

THREE. AmbientLight

顏色將應用到全局,將場景中所有物體渲染為相同顏色

THREE. SpotLight 光源來產生陰影

THREE. Color

函數名描述
set(value)十六進制顏色值,可以是字符串,數值,THREE. Color
setHex(value)十六進制數字值
setRGB(r, g, b)RGB 值顏色,范圍 0~1
setHSL(h, s, l)HSL 值顏色,范圍 0~1
setStyle(style)css 顏色
copy(color)復制顏色對象
copyGammaToLinear(color)伽馬色彩轉換到線性色彩,內部使用
copyLinearToGamma(color)線性色彩轉換到伽馬色彩,內部使用
convertGammaToLinear(color)伽馬色彩轉換到線性色彩
convertLinearToGammacolor)線性色彩轉換到伽馬色彩
getHex()十六進制值
getHexString()十六進制字符串
getStyle()css 顏色
getHSL(optionalTarget)HSL 顏色值
offsetHSL(h, s, l)將 h, s, l 添加到當前顏色 h, s, l
add(color)將 r, g, b 添加到當前顏色
addColors(color1, color2)內部使用,color1, color2 相加
addScalar(s)內部使用,當前顏色 RGB 分量上
multiply(color)內部使用,當前顏色與 THREE.color 對象的 RGB 值相乘
multiplyScalar(s)內部使用,當前顏色與 RGB 值相乘
lerp(color, alpha)內部使用,找出介于對象和顏色和提供顏色之間的顏色,alpha 定義當前顏色與提供顏色的差距
lerp(color, alpha)內部使用,找出介于對象和顏色和提供顏色之間的顏色,alpha 定義當前顏色與提供顏色的差距
equals(color)THREE. Color 顏色對象的 RGB 值與當前值相等與否
fromArray(array)與 setRGB 方法具有相同的功能,只是 RGB 值通過數字數組傳入
toArray返回三元素組[r, g, b]
clone()復制當前顏色

THREE. PointLight

THREE. PointLight 從特定的一點向所有方向發射光線,點光源

屬性描述
color(顏色)光源顏色
distance(距離)光源照射的距離,默認 0,以為光的強度不會隨距離增加而減少
intensity(強度)光源照射的強度, 默認 1
position(位置)光源在場景中的位置
visible(是否可見)true 光源打開,false 光源關閉
var pointColor = '#ccffcc'; var pointLight = new THREE.PointLight(pointColor); pointLight.position.set(10, 10, 10); pointLight.intensity = 2.4; pointLight.distance = 100; scene.add(pointLight);

THREE. SpotLight

從特定一點發射錐形光線,聚光燈光源
其他屬性同 THREE. PointLight

屬性描述
angle(角度)光源發射出的光速寬度,單位弧度, 默認值 Math. PI/3
caseShadow(投影)光源是否產生投影
exponent(光強衰減指數)光線強度遞減的速度
onlyShadow(僅陰影)光源只生成陰影,不會再場景中添加任何光照
shadowBias(陰影偏移)偏置陰影的位置,默認 0
shadowCameraFar(投影遠點)到距離光源光源那個位置可生成陰影,默認值為 5000
shadowCameraFov(投影視場)用于生成陰影的視場有多大,默認值為 50
shadowCameraNear(投影近點)到距離光源光源那個位置開始生成陰影,默認值為 50
shadowCameraVisible(陰影方式可見)光源陰影設置可見與否
shadowDarkness(陰影暗度)陰影渲染的暗度,在場景渲染后無法更改,默認 0.5
shadowMapWidth, shadowMapHeight(陰影映射寬度和高度)決定有多少像素用來生成陰影,若陰影鋸齒狀或不光滑,增加此值,渲染后無法更改,默認 512
target(目標)光源只想場景中的特定對象或位置
var pointColor = '#ffffff'; var spotLight = new THREE.spotLight(pointColor); spotLight.position.set(-40, 60, -10); spotLight.castShadow = true; spotLight.target = plane; var target = new THREE.Object3D(); target.position = new THREE.Vector3(5, 0, 0); spotLight.target = target;scene.add(spotLight);

陰影使用可能遇到的問題

  • 陰影模糊,增加shadowMapWidth 和shadowMapHeight,或保證用于計算陰影區域緊密包圍在對象周圍(shadowCameraNear,shadowCameraFar,shadowCameraFov)
  • 產生陰影與接收陰影設置,光源生成陰影,幾何體是否接受或投射陰影castShadow 和 receiveShadow
  • 薄對象渲染陰影時可能出現奇怪的渲染失真,可通過 shadowBias 輕微偏移陰影來修復
  • 調整 shadowDarkness 來改變陰影的暗度
  • 陰影更柔和,可在 THREE. WebGLRenderer 設置不同 shadowMapType。默認 THREE. PCFShadowMap, 柔和:PCFSoftShadowMap

THREE. DirectionalLisht

從而為平面發射光線,光線彼此平行,平行光源,光強是一樣的其他屬性同 SpotLight

//陰影區域 directionalLight.shadowCameraNear = 2; directionalLight.shadowCameraFar = 200; directionalLight.shadowCameraLeft = -50; directionalLight.shadowCameraRight = 50; directionalLight.shadowCameraTop = 50; directionalLight.shadowCameraBottom = -50;//創建更好的陰影效果 directionalLight.shadowCascade = true; //將陰影生成分裂,靠近攝像機十點會產生更具細節的陰影,遠離攝像機十點陰影的細節更少 directionalLight.shadowCascadeCount;shadowCascadeBias; shadowCascadeWidth; shadowCascadeHeight; shadowCascadeNearZ; shadowCascadeFarZ;

THREE. HemisphereLight

戶外光照效果

var hemiLight = new THREE.HemisphereLight(0x0000ff, 0x00ff00, 0.6); hemiLight.position.set(0, 500, 0); scene.add(hemiLight); 屬性描述
groundColor從地面發出的光線顏色
color從天空發出的光線顏色
intensity光線照射強度

THREE. AreaLight

長方體的發光區域
使用 WebGLDeferredRenderer

<script type="text/javascript" src="../libs/WebGLDeferredRenderer.js"></script> <script type="text/javascript" src="../libs/ShaderDeferred.js"></script> <script type="text/javascript" src="../libs/RenderPass.js"></script> <script type="text/javascript" src="../libs/EffectComposer.js"></script> <script type="text/javascript" src="../libs/CopyShader.js"></script> <script type="text/javascript" src="../libs/ShaderPass.js"></script> <script type="text/javascript" src="../libs/FXAAShader.js"></script> <script type="text/javascript" src="../libs/MaskPass.js"></script> var renderer = new THREE.WebGLDeferredRenderer({width: window.innerWidth,height: window.innerHeight,scale: 1,antialias: true,tonemapping: THREE.FilmicOperator,brightness: 2.5, }); var areaLight1 = new THREE.AreaLight(0xff0000, 3); areaLight1.position.set(-10, 10, -35); areaLight1.rotation.set(-Math.PI / 2, 0, 0); areaLight1.width = 4; areaLight1.height = 9.9; scene.add(areaLight1);var planeGeometry1 = new THREE.BoxGeometry(4, 10, 0); var planeGeometry1Mat = new THREE.MeshBasicMaterial({color: 0xff0000 }); var plane1 = new THREE.Mesh(planeGeometry1, planeGeometry1Mat); //在areaLight相同位置 防止對象來模擬光線照射的區域 plane1.position.copy(areaLight1.position);scene.add(plane1);

THREE. LensFlare

鏡頭光暈
flare = new THREE.LensFlare(texture, size, distance, blending, color, opacity);

參數描述
texture(紋理)圖片紋理,用來決定光暈的形狀
size(尺寸)光暈大小,單位像素,值-1,使用紋理本身的尺寸
distance(距離)從光源 0 到攝像機 1 的距離,將鏡頭光暈防止在正確位置
blending(混合)為光暈提供多種材質,混合材質,默認 THREE. AdditiveBlending
color(顏色)光暈顏色
var textureFlare0 = THREE.ImageUtils.loadTexture('../assets/textures/lensflare/lensflare0.png'); var textureFlare3 = THREE.ImageUtils.loadTexture('../assets/textures/lensflare/lensflare3.png');var flareColor = new THREE.Color(0xffaacc); var lensFlare = new THREE.LensFlare(textureFlare0, 350, 0.0, THREE.AdditiveBlending, flareColor);lensFlare.add(textureFlare3, 60, 0.6, THREE.AdditiveBlending); lensFlare.add(textureFlare3, 70, 0.7, THREE.AdditiveBlending); lensFlare.add(textureFlare3, 120, 0.9, THREE.AdditiveBlending); lensFlare.add(textureFlare3, 70, 1.0, THREE.AdditiveBlending);lensFlare.position.copy(spotLight.position); scene.add(lensFlare);

2. 使用 Three.js 的材質

名稱描述
MeshBasicMaterial(網格基礎材質)給幾何體賦予一種簡單顏色,可顯示幾何體線框
MeshDepthMaterial(網格深度材質)從攝像機到網格的距離決定如何給網格上色
MeshNormalMaterial(網格法向材質)根據法向量計算物體表面的顏色
MeshFaceMaterial(網格面材質)容器,可為幾何體的各個表面指定不同的材質
MeshLambertMaterial(網格 Lambert 材質)考慮光照影響,用于創建暗淡、不光亮的物體
MeshPhongMaterial(網格 Phong 式材質)考慮光照影響,用于創建光亮的物體
ShaderMaterial(著色器材質)允許自定義的著色器程序,直接控制頂點的繁殖方式和像素的著色方式,與 THREE. BufferedGeometry 一起使用
LineBaseMaterial(直線基礎材質)用于 THREE. Line 幾何體,創建著色的直線
LineDashMaterial(虛線材質)同上,允許創建出虛線效果

分類

  • 基礎屬性:最常用,可控制物體的不透明度,是否可見以及被應用
  • 融合屬性:每個物體都有一系列的融合屬性,決定物體與背景的融合
  • 高級屬性:可控制底層 WebGL 上下午對象渲染物體的方式

基礎屬性 THREE. Material

屬性描述
id(標識符)用來識別材質,并在材質創建時復制,第一個材質的值從 0 開始,每新增一個材質這個值加 1
uuid(通用唯一識別碼)生成的唯一 ID, 內部使用
name(名稱)給材質賦予名稱,用于調試的目的
opacity(不透明度)定義物體的透明度,與 transparent 一起使用,范圍 0~1
transparent(是否透明)true: 使用指定的不透明度的渲染物體,false: 物體不透明只是著色更加明亮,若使用 alpha 通道的紋理,設置為 true
overdraw(過度描繪)THREE. CanvasRender 時多邊形會被渲染得稍微大一點,設 true
visible(是否可見)材質是否可見,false 場景中不見該物體
side(側面)幾何體的哪一面應用材質,默認 THREE. FrontSide(前面,外側), THREE. BackSide(背面,內側), THREE. DoubleSide(雙側)
needsUpdate(是否更新)true: 更新材質屬性

混合屬性

名稱描述
blending(融合)物體上材質與背景如何融合,一般融合模式 THREE. NormalBlending,只顯示材質上層
blendsrc(融合源)自定義融合模式,物體(源),背景(目標),默認 THREE. SrcAlphaFactor,使用 alpha 透明度通道融合
blenddst(融合目標)默認 THREE. OneMinusSrcAlphaFactor, 也是用透明度融合,值 1
blendequation(融合公式)默認相加 AddEquation

高級屬性

名稱描述
depthTest可打開 GL_DEPTH_TEST 參數,控制是否使用像素深度來計算心像素值
depthWrite內部屬性,用來決定材質是否影響 WebGL 深度緩存,二維貼圖時設 false
polygonOffset, polygonOffsetFactor, polygonOffsetUnits控制 WebGL 的 POLYGON_OFFSET_FILL 特性
alphatest范圍 0~1,某個像素小于該值則不顯示,移除一些與透明度相關的毛邊

MeshBaseMaterial

var meshMaterial = new THREE.MeshBasicMaterial({color: 0x7777ff });var meshMaterial = new MeshBasicMaterial(); material.color = new THREE.Color(0xff0000); 名稱描述
color(顏色)設置材質的顏色
wireframe(線框)將材質渲染成線框
wireframeLinewidth(線框線寬)線框中線的寬度
wireframeLinecap(線框線段端點)可選 butt 平, round 圓, square 方,默認 round,WebGLRenderer 不支持
wireframeLinejoin(線框線段連接點)同上
shading(著色)可選 THREE. SmoothShading(默認), THREE. NoShading, THREE. FlatShading
vertexColors(頂點顏色)默認 THREE. NoColors, 設置后采用 THREE. Geometry 對象的 colors 屬性 CanvasRenderer 不起作用
fog(霧化)是否受全局霧化效果影響

THREE. MeshDepthMaterial

名稱描述
wireframe(線框)是否顯示線框
wireframeLinewidth(線框線寬)線框中線的寬度

聯合材質

var cubeMaterial = new THREE.MeshDepthMaterial(); var colorMaterial = new THREE.MeshBasicMaterial({color: controls.color,transparent: true, //blending: THREE.MultiplyBlending, //混合模式,與背景相互作用 }); var cube = new THREE.SceneUtils.createMultiMaterialObject(cubeGeometry, [colorMaterial,cubeMaterial, ]); cube.children[1].scale.set(0.99, 0.99, 0.99); //避免畫面閃爍

THREE. MeshNormalMaterial

使用 THREE. ArrowHelper 添加法向量

for (var f = 0, fl = sphere.geometry.faces.length; f < fl; f++) {var face = sphere.geometry.faces[f];var centroid = new THREE.Vector3(0, 0, 0);centroid.add(sphere.geometry.vertices[face.a]);centroid.add(sphere.geometry.vertices[face.b]);centroid.add(sphere.geometry.vertices[face.c]);centroid.divideScalar(3);var arrow = new THREE.ArrowHelper(face.normal, centroid, 2, 0x3333ff, 0.5, 0.5);sphere.add(arrow); } 名稱描述
wireframe(線框)是否顯示線框
wireframeLinewidth(線框線寬)線框中線的寬度
shading設置著色方法,THREE. FlatShading 平面著色, THREE. SmoothShadding 平滑著色

THREE. MeshFaceMaterial

材質容器,允許集合體的每個面指定不同的材質

var mats = []; mats.push(new THREE.MeshBasicMaterial({color: 0x009e60 })); mats.push(new THREE.MeshBasicMaterial({color: 0x009e60 })); mats.push(new THREE.MeshBasicMaterial({color: 0x0051ba })); mats.push(new THREE.MeshBasicMaterial({color: 0x0051ba })); mats.push(new THREE.MeshBasicMaterial({color: 0xffd500 })); mats.push(new THREE.MeshBasicMaterial({color: 0xffd500 })); mats.push(new THREE.MeshBasicMaterial({color: 0xff5800 })); mats.push(new THREE.MeshBasicMaterial({color: 0xff5800 })); mats.push(new THREE.MeshBasicMaterial({color: 0xc41e3a })); mats.push(new THREE.MeshBasicMaterial({color: 0xc41e3a })); mats.push(new THREE.MeshBasicMaterial({color: 0xffffff })); mats.push(new THREE.MeshBasicMaterial({color: 0xffffff }));var faceMaterial = new THREE.MeshFaceMaterial(mats);//魔方 for (var x = 0; x < 3; x++) {for (var y = 0; y < 3; y++) {for (var z = 0; z < 3; z++) {var cubeGeom = new THREE.BoxGeometry(2.9, 2.9, 2.9);var cube = new THREE.Mesh(cubeGeom, faceMaterial);cube.position.set(x * 3 - 3, y * 3, z * 3 - 3);group.add(cube);}} }

THREE. MeshPhongMaterial

創建光亮材質,屬性與暗淡材質 THREE. MeshLambertMaterial 基本屬性一樣

名稱描述
ambient環境色,顏色與環境色相乘,默認白色
emissive材質發射的顏色,默認黑色,不收其他光照影響的顏色
specular指定材質光亮程度及高光部分的顏色,設為與color相同顏色,類似金屬材質,設為灰色grey則更像塑料
shininess鏡面高光部分的亮度,默認值30
metaltrue金屬效果,效果微弱
wrapAroundtrue啟用辦lambert光照技術,光下降更微妙,網格粗糙黑暗地區瑩陰影柔和且分布更加均勻
wrapRGBtrue可使用THREE. Vector3控制光下降的速度

THREE. ShaderMaterial 創建自己的著色器

著色器可講Three.js中的JavaScript網格轉換為屏幕上的像素,可指定對象如何渲染,如何覆蓋或修改Three.js庫中的默認值

名稱描述
wireframe是否顯示線框
wireframeLinewidth線框中線的寬度
shading設置著色方法,THREE. FlatShading 平面著色, THREE. SmoothShadding 平滑著色
vertexColors給每個頂點定義不同的顏色,對CanvasRenderer不起作用,對WebGLRenderer起作用
fog是否受全局無話效果影響
名稱描述
fragmentShader定義的每個傳入像素的顏色(必傳)
vertexShader允許你修改傳入的定點位置(必傳)
uniforms可想你的著色器發信息,同樣的信息會發送給每一個頂點和片段
defines轉換成#define代碼片段,這些片段可以設置著著色程序里的額外全局變量
attributes可修改每個頂點和片段,用來傳遞每個位置數據和法向量相關的數據
lights定義光照數據是否傳遞給著色器,默認false
  • vertexShader:它會在幾何體的每個頂點上執行,可用這個著色器改變頂點的位置來對集合體進行變換

  • fragmentShader: 它會在集合體的每一個片段上執行,在VertexShader里,會返回這個特定片段應該顯示的顏色

<script id="vertex-shader" type="x-shader/x-vertex">uniform float time;varying vec2 vUv;void main(){vec3 posChanged = position;posChanged.x = posChanged.x*(abs(sin(time*1.0)));posChanged.y = posChanged.y*(abs(cos(time*1.0)));posChanged.z = posChanged.z*(abs(sin(time*1.0)));//gl_Position = projectionMatrix * modelViewMatrix * vec4(position*(abs(sin(time)/2.0)+0.5),1.0);gl_Position = projectionMatrix * modelViewMatrix * vec4(posChanged,1.0);}</script> function createMaterial(vertexShader, fragmentShader) {var vertShader = document.getElementById(vertexShader).innerHTML;var fragShader = document.getElementById(fragmentShader).innerHTML;var attributes = {};var uniforms = {time: {type: 'f',value: 0.2},scale: {type: 'f',value: 0.2},alpha: {type: 'f',value: 0.6},resolution: {type: "v2",value: new THREE.Vector2()}};uniforms.resolution.value.x = window.innerWidth;uniforms.resolution.value.y = window.innerHeight;var meshMaterial = new THREE.ShaderMaterial({uniforms: uniforms,attributes: attributes,vertexShader: vertShader,fragmentShader: fragShader,transparent: true});return meshMaterial; }var cubeGeometry = new THREE.BoxGeometry(20, 20, 20);var meshMaterial1 = createMaterial("vertex-shader", "fragment-shader-1"); var meshMaterial2 = createMaterial("vertex-shader", "fragment-shader-2"); var meshMaterial3 = createMaterial("vertex-shader", "fragment-shader-3"); var meshMaterial4 = createMaterial("vertex-shader", "fragment-shader-4"); var meshMaterial5 = createMaterial("vertex-shader", "fragment-shader-5"); var meshMaterial6 = createMaterial("vertex-shader", "fragment-shader-6");var material = new THREE.MeshFaceMaterial([meshMaterial1,meshMaterial2,meshMaterial3,meshMaterial4,meshMaterial5,meshMaterial6]);var cube = new THREE.Mesh(cubeGeometry, material);

THREE. LineBaseMaterial

用于線段的基礎材質

名稱描述
color線的顏色,指定vertexColors該屬性會被忽略
linewidth線的寬度
linecap線段端點,可選只butt(平),round(圓),square(方),默認round
linejoin線段連接,可選只butt(平),round(圓),square(方),默認round
vertexColor每個頂點指定一種顏色
fog當前材質是否受全局無話效果影響
var points = gosper(4, 60); //gosper曲線var lines = new THREE.Geometry(); var colors = []; var i = 0; points.forEach(function(e) {lines.vertices.push(new THREE.Vector3(e.x, e.z, e.y));colors[i] = new THREE.Color(0xffffff);colors[i].setHSL(e.x / 100 + 0.5, (e.y * 20) / 300, 0.8);i++; });lines.colors = colors; var material = new THREE.LineBasicMaterial({opacity: 1.0,linewidth: 1,vertexColors: THREE.VertexColors });var line = new THREE.Line(lines, material);

THREE. LineDashMaterial

屬性與THREE. LineBaseMaterial一樣,可指定虛線與空白間隙的長度來創建出虛線效果

名稱描述
scale放縮dashSize和gapSize
dashSize虛線長度
gapSize虛線間隔寬度
lines.computeLineDistances();var material = new THREE.LineDashedMaterial({vertexColors: true,color: 0xffffff,dashSize: 2,gapSize: 2,scale: 0.1});

總結

以上是生活随笔為你收集整理的Three开发笔记(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。