BabylonJS - องค์ประกอบพื้นฐาน
Babylon.js เป็นเฟรมเวิร์กยอดนิยมในการช่วยสร้างเกม 3 มิติสำหรับนักพัฒนา มีฟังก์ชันในตัวเพื่อใช้งานฟังก์ชัน 3D ให้เราสร้างการสาธิตง่ายๆโดยใช้ Babylon.js และทำความเข้าใจฟังก์ชันพื้นฐานที่จำเป็นในการเริ่มต้น
ก่อนอื่นเราจะสร้างการสาธิตที่มีองค์ประกอบพื้นฐานของ Babylon.js นอกจากนี้เรายังจะได้เรียนรู้ฟังก์ชันต่างๆของ Babylon.js
ตัวอย่างการสาธิต 1
ในส่วนนี้เราจะเรียนรู้วิธีสร้างการสาธิตที่มีองค์ประกอบพื้นฐานของ BabylonJS
<!doctype html>
<html>
<head>
<meta charset = "utf-8">
<title> Babylon.JS : Demo2</title>
<script src = "babylon.js"></script>
<style>
canvas { width: 100%; height: 100%;}
</style>
</head>
<body>
<canvas id = "renderCanvas"></canvas>
<script type = "text/javascript">
var canvas = document.getElementById("renderCanvas");
var engine = new BABYLON.Engine(canvas, true);
var createScene = function() {
var scene = new BABYLON.Scene(engine);
scene.clearColor = new BABYLON.Color3(1, 0.8, 0.8);
var camera = new BABYLON.ArcRotateCamera("Camera", 1, 0.8, 10, new BABYLON.Vector3(0, 0, 0), scene);
scene.activeCamera.attachControl(canvas);
var light0 = new BABYLON.PointLight("Omni", new BABYLON.Vector3(0, 0, 10), scene);
var origin = BABYLON.Mesh.CreateSphere("origin", 10, 1.0, scene);
var torus = BABYLON.Mesh.CreateTorus("torus", 5, 1, 10, scene, false);
var box = BABYLON.Mesh.CreateBox("box", 3.0, scene);
box.position = new BABYLON.Vector3(-5, 0, 0);
var cylinder = BABYLON.Mesh.CreateCylinder("cylinder", 3, 3, 3, 6, 1, scene, false);
cylinder.position = new BABYLON.Vector3(5, 0, 0);
return scene;
};
var scene = createScene();
engine.runRenderLoop(function() {
scene.render();
});
</script>
</body>
</html>
ในการเรียกใช้ BabylonJS เราต้องการเบราว์เซอร์ที่ทันสมัยพร้อมการสนับสนุน WEBGL เบราว์เซอร์ล่าสุด -Internet Explorer 11+, Firefox 4+, Google Chrome 9+, Opera 15+ และอื่น ๆ มีการรองรับ WEBGL และการสาธิตสามารถดำเนินการบนแพลตฟอร์มเดียวกันเพื่อดูผลลัพธ์ สร้างไดเร็กทอรีเพื่อจัดเก็บไฟล์สำหรับ babylonjs ดึงไฟล์ BabylonJSscripts ล่าสุดจากเว็บไซต์ BabylonJS ลิงก์สาธิตทั้งหมดในบทช่วยสอนนี้ได้รับการทดสอบกับ babylonjs เวอร์ชัน 3.3
ขั้นตอนที่ 1
สร้างเพจ html ง่ายๆและรวมไฟล์ Babylon.js
สร้างแท็กผ้าใบที่ใช้ในการแสดงเนื้อหาโดย BabylonJSinside แท็กเนื้อหาดังที่แสดงด้านล่าง
เพิ่ม css ลงในผืนผ้าใบเพื่อให้เต็มความกว้างและความสูงของหน้าจอ
<!doctype html>
<html>
<head>
<meta charset = "utf-8">
<title>MDN Games: Babylon.js demo - shapes</title>
<script src = "babylon.js"></script>
<style>
canvas {width: 100%; height: 100%;}
</style>
</head>
<body>
<canvas id = "renderCanvas"></canvas>
</body>
</html>
ขั้นตอนที่ 2
ตอนนี้ให้เราเริ่มด้วย BabylonJScode สำหรับการแสดงผลเนื้อหาบนผืนผ้าใบ
<!doctype html>
<html>
<head>
<meta charset = "utf-8">
<title>MDN Games: Babylon.js demo - shapes</title>
<script src = "babylon.js"></script>
<style>
canvas {width: 100%; height: 100%;}
</style>
</head>
<body>
<canvas id = "renderCanvas"></canvas>
<script type = "text/javascript">
var canvas = document.getElementById("renderCanvas");
var engine = new BABYLON.Engine(canvas, true);
</script>
</body>
</html>
ตอนนี้เพิ่มแท็กสคริปต์ลงในโครงสร้าง html และจัดเก็บการอ้างอิงผ้าใบในพื้นที่ตัวแปร
ในการเริ่มต้นกับ Babylon.js ให้สร้างอินสแตนซ์เอ็นจิ้นและส่งการอ้างอิงผ้าใบเพื่อแสดงผล
<script type = "text/javascript">
var canvas = document.getElementById("renderCanvas");
var engine = new BABYLON.Engine(canvas, true);
</script>
วัตถุส่วนกลางของ BABYLON มีฟังก์ชัน Babylon.js ทั้งหมดที่มีอยู่ในเครื่องยนต์
ขั้นตอนที่ 3
ในขั้นตอนนี้เราจะสร้างฉากก่อน
ฉากคือที่ที่จะแสดงเนื้อหาทั้งหมด เราจะสร้างวัตถุประเภทต่างๆและเพิ่มสิ่งที่เหมือนกันในฉากเพื่อให้มองเห็นได้บนหน้าจอ ในการสร้างฉากให้เพิ่มรหัสต่อไปนี้ในโครงสร้าง html ที่สร้างไว้แล้ว ในปัจจุบันเราจะผนวกโค้ดที่สร้างไว้แล้วเป็นส่วนต่อเนื่องกับโครงสร้าง html ข้างต้น
var createScene = function() {
var scene = new BABYLON.Scene(engine);
scene.clearColor = new BABYLON.Color3(1, 0.8, 0.8);
};
var scene = createScene();
ไฟล์ html สุดท้ายจะมีลักษณะดังนี้ -
<!doctype html>
<html>
<head>
<meta charset = "utf-8">
<title>MDN Games: Babylon.js demo - shapes</title>
<script src = "babylon.js"></script>
<style>
canvas {width: 100%; height: 100%;}
</style>
</head>
<body>
<canvas id = "renderCanvas"></canvas>
<script type = "text/javascript">
var canvas = document.getElementById("renderCanvas");
var engine = new BABYLON.Engine(canvas, true);
var createScene = function() {
var scene = new BABYLON.Scene(engine);
scene.clearColor = new BABYLON.Color3(0, 1, 0);
return scene;
};
var scene = createScene();
</script>
</body>
</html>
ในตัวอย่างข้างต้นฟังก์ชัน CreateScene ถูกกำหนดและ var scene = createScene () กำลังเรียกใช้ฟังก์ชัน
ฟังก์ชัน CreateScene มีฉากที่สร้างขึ้นภายในและบรรทัดถัดไปจะเพิ่มสีให้กับฉากซึ่งทำได้โดยใช้ BABYLON.Color3 (1, 0.8, 0.8) และสีตรงนี้จะเป็นสีชมพู
var scene = new BABYLON.Scene(engine);
scene.clearColor = new BABYLON.Color3(1, 0.8, 0.8);
การดำเนินการตามลิงค์สาธิตด้านบนในเบราว์เซอร์จะไม่แสดงอะไรเลยบนหน้าจอเบราว์เซอร์ มีอีกหนึ่งขั้นตอนที่จะถูกเพิ่มเข้าไปในโค้ดซึ่งเรียกว่า engine.runRenderLoop เหมือนในขั้นตอนที่ 4
ขั้นตอนที่ 4
ในการทำให้ฉากมองเห็นได้จริงบนหน้าจอเราต้องเรนเดอร์โดยใช้การโทร engine.runRenderLoop ตอนนี้ให้เราดูว่าจะทำอย่างไร
ลูปการแสดงผล
engine.runRenderLoop(function() {
scene.render();
});
ฟังก์ชัน Engine.runRenderLoop เรียกใช้ scene.render ซึ่งจะแสดงฉากและทำให้ผู้ใช้มองเห็นได้ . html สุดท้ายจะมีลักษณะดังนี้ -
<!doctype html>
<html>
<head>
<meta charset = "utf-8">
<title>BabylonJs - Basic Element-Creating Scene</title>
<script src = "babylon.js"></script>
<style>
canvas {width: 100%; height: 100%;}
</style>
</head>
<body>
<canvas id = "renderCanvas"></canvas>
<script type = "text/javascript">
var canvas = document.getElementById("renderCanvas");
var engine = new BABYLON.Engine(canvas, true);
var createScene = function() {
var scene = new BABYLON.Scene(engine);
scene.clearColor = new BABYLON.Color3(1, 0.8, 0.8);
return scene;
};
var scene = createScene();
engine.runRenderLoop(function() {
scene.render();
});
</script>
</body>
</html>
บันทึกไฟล์ด้านบนเป็น Basicscene.html และตรวจสอบผลลัพธ์ในเบราว์เซอร์ หน้าจอที่แสดงเป็นสีชมพูดังภาพด้านล่าง -
ขั้นตอนที่ 5
ตอนนี้เรามีฉากแล้วเราต้องเพิ่มกล้องเข้าไป
การเพิ่มกล้องและแสง
รหัสที่ระบุด้านล่างนี้จะเพิ่มกล้องเข้าไปในฉาก มีกล้องหลายประเภทที่สามารถใช้กับบาบิโลนได้
ArcRotateCameraคือกล้องที่หมุนไปรอบ ๆ เป้าหมาย สามารถควบคุมด้วยเมาส์เคอร์เซอร์หรือสัมผัสเหตุการณ์ พารามิเตอร์ที่ต้องการ ได้แก่ ชื่ออัลฟ่าเบต้ารัศมีเป้าหมายและฉาก ให้เราคุยรายละเอียดของกล้องในส่วนต่อไป
var camera = new BABYLON.ArcRotateCamera("Camera", 1, 0.8, 10, new BABYLON.Vector3(0, 0, 0), scene);
ตอนนี้เราต้องเข้าใจวิธีการเพิ่มแสง
ไฟใช้ในการสร้างสีที่กระจายและเป็นพิเศษที่ได้รับจากแต่ละพิกเซล ไฟมีหลายประเภท เราจะเรียนรู้เกี่ยวกับไฟประเภทต่างๆในส่วนของไฟ
ที่นี่ฉันใช้ PointLight ในฉาก PointLight ถูกปล่อยออกมาทุกทิศทางเช่นเดียวกับดวงอาทิตย์ พารามิเตอร์คือชื่อตำแหน่งและฉากที่จะใช้
ในการเพิ่มแสงให้ดำเนินการตามรหัสต่อไปนี้ -
var light0 = new BABYLON.PointLight("Omni", new BABYLON.Vector3(0, 0, 10), scene);
ขั้นตอนที่ 6
ตอนนี้ให้เราดูวิธีเพิ่มรูปร่าง
การเพิ่มรูปร่าง
การสาธิตที่แชร์ด้านบนมี 4 รูปร่างที่เพิ่มเข้ามา
- Sphere
- Torus
- Box
- Cylinder
ในการเพิ่มทรงกลมให้รันโค้ดต่อไปนี้ -
var origin = BABYLON.Mesh.CreateSphere("origin", 10, 1.0, scene);
เมื่อเพิ่มทรงกลมแล้วโค้ดจะมีลักษณะดังนี้ -
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>MDN Games: Babylon.js demo - shapes</title>
<script src = "babylon.js"></script>
<style>
html,body,canvas { margin: 0; padding: 0; width: 100%; height: 100%; font-size: 0; }
</style>
</head>
<body>
<canvas id = "renderCanvas"></canvas>
<script type = "text/javascript">
var canvas = document.getElementById("renderCanvas");
var engine = new BABYLON.Engine(canvas, true);
var createScene = function() {
var scene = new BABYLON.Scene(engine);
scene.clearColor = new BABYLON.Color3(1, 0.8, 0.8);
var camera = new BABYLON.ArcRotateCamera("Camera", 1, 0.8, 10, new BABYLON.Vector3(0, 0, 0), scene);
var light0 = new BABYLON.PointLight("Omni", new BABYLON.Vector3(0, 0, 10), scene);
var origin = BABYLON.Mesh.CreateSphere("origin", 10, 1.0, scene);
scene.activeCamera.attachControl(canvas);
return scene;
};
var scene = createScene();
engine.runRenderLoop(function() {
scene.render();
});
</script>
</body>
</html>
เอาต์พุต
รหัสด้านบนสร้างผลลัพธ์ต่อไปนี้ -
ตอนนี้ให้เราเพิ่มรูปทรงอื่น ๆ - Torus และกล่อง ดำเนินการรหัสต่อไปนี้เพื่อเพิ่มรูปร่าง Torus
var torus = BABYLON.Mesh.CreateTorus("torus", 5, 1, 10, scene, false);
var box = BABYLON.Mesh.CreateBox("box", 3.0, scene);
box.position = new BABYLON.Vector3(-5, 0, 0);
เราจะเพิ่มตำแหน่งลงในกล่อง BABYLON.Vector3 (-5, 0, 0) ใช้ทิศทาง x, y และ z
เมื่อดำเนินการรหัสด้านบนจะสร้างผลลัพธ์ต่อไปนี้ -
ตอนนี้ให้เราเพิ่มรูปร่างสุดท้ายซึ่งแสดงในภาพหน้าจอด้านบน - ทรงกระบอก
var cylinder = BABYLON.Mesh.CreateCylinder("cylinder", 3, 3, 3, 6, 1, scene, false);
cylinder.position = new BABYLON.Vector3(5, 0, 0);
ตำแหน่งจะถูกเพิ่มเข้าไปในกระบอกสูบซึ่งเป็นทิศทาง x 5 รหัสสุดท้ายดังแสดงด้านล่าง -
<!doctype html>
<html>
<head>
<meta charset = "utf-8">
<title> Babylon.JS : Demo2</title>
<script src = "babylon.js"></script>
<style>
canvas { width: 100%; height: 100%;}
</style>
</head>
<body>
<canvas id = "renderCanvas"></canvas>
<script type = "text/javascript">
var canvas = document.getElementById("renderCanvas");
var engine = new BABYLON.Engine(canvas, true);
var createScene = function() {
var scene = new BABYLON.Scene(engine);
scene.clearColor = new BABYLON.Color3(1, 0.8, 0.8);
var camera = new BABYLON.ArcRotateCamera("Camera", 1, 0.8, 10, new BABYLON.Vector3(0, 0, 0), scene);
scene.activeCamera.attachControl(canvas);
var light0 = new BABYLON.PointLight("Omni", new BABYLON.Vector3(0, 0, 10), scene);
var origin = BABYLON.Mesh.CreateSphere("origin", 10, 1.0, scene);
var torus = BABYLON.Mesh.CreateTorus("torus", 5, 1, 10, scene, false);
var box = BABYLON.Mesh.CreateBox("box", 3.0, scene);
box.position = new BABYLON.Vector3(-5, 0, 0);
var cylinder = BABYLON.Mesh.CreateCylinder("cylinder", 3, 3, 3, 6, 1, scene, false);
cylinder.position = new BABYLON.Vector3(5, 0, 0);
return scene;
};
var scene = createScene();
engine.runRenderLoop(function() {
scene.render();
});
</script>
</body>
</html>
เอาต์พุต
เมื่อดำเนินการรหัสด้านบนจะสร้างผลลัพธ์ต่อไปนี้ -
รูปร่างจะเคลื่อนที่ตามทิศทางที่คุณเลื่อนเคอร์เซอร์ ทำได้เช่นเดียวกันโดยใช้การควบคุมการแนบของกล้องเข้ากับฉาก
scene.activeCamera.attachControl(canvas);
ตอนนี้ให้เราคุยรายละเอียดแต่ละรูปร่าง
นี่คือบทสรุปของรูปร่างและไวยากรณ์ทั้งหมด -
ซีเนียร์ No | รูปร่าง | ไวยากรณ์ |
---|---|---|
1 | กล่อง |
|
2 | ทรงกลม |
|
3 | เครื่องบิน |
|
4 | ดิสก์ |
|
5 | กระบอกสูบ |
|
6 | ทอรัส |
|
7 | ปม |
|
8 | เส้นตาข่าย |
|
9 | เส้นขีดกลาง |
|
10 | ริบบิ้น |
|
11 | หลอด |
|
12 | พื้น |
|
13 | พื้นดินจากความสูง |
|
14 | พื้นกระเบื้อง | |
องค์ประกอบพื้นฐาน - ตำแหน่งการหมุนและการปรับขนาด
ในส่วนนี้เราจะเรียนรู้วิธีการจัดตำแหน่งหมุนหรือปรับขนาดองค์ประกอบที่เราเพิ่มไปจนถึงตอนนี้
เราได้สร้างกล่องทรงกลมทรงกระบอกปม ฯลฯ ตอนนี้เราจะมาดูวิธีการวางตำแหน่งขนาดและหมุนรูปร่าง
ซีเนียร์ | องค์ประกอบและคำอธิบาย |
---|---|
1 | ตำแหน่ง ด้วยการเปลี่ยนตำแหน่งตาข่ายจะเปลี่ยนจากตำแหน่งหนึ่งไปอีกตำแหน่งหนึ่ง |
2 | การหมุน ด้วยการหมุนตาข่ายจะถูกหมุนรอบตาข่าย |
3 | การปรับขนาด การปรับขนาดของตาข่ายสามารถทำได้โดยเทียบกับแกน x, y หรือ z |
องค์ประกอบพื้นฐาน - การเลี้ยงดู
ด้วยการเลี้ยงดูเราจะสร้างความสัมพันธ์พ่อแม่ลูกระหว่างตาข่ายและดูว่าพวกเขามีพฤติกรรมอย่างไร ดังนั้นการเปลี่ยนแปลงใด ๆ ที่คุณนำไปใช้กับพ่อแม่ก็จะนำไปใช้กับเด็กเช่นกัน ตอนนี้ให้เราเข้าใจสิ่งเดียวกันกับการสาธิตที่แสดงด้านล่าง
การสาธิต
<!doctype html>
<html>
<head>
<meta charset = "utf-8">
<title>BabylonJs - Basic Element-Creating Scene</title>
<script src = "babylon.js"></script>
<style>
canvas {width: 100%; height: 100%;}
</style>
</head>
<body>
<canvas id = "renderCanvas"></canvas>
<script type = "text/javascript">
var canvas = document.getElementById("renderCanvas");
var engine = new BABYLON.Engine(canvas, true);
var createScene = function() {
var scene = new BABYLON.Scene(engine);
scene.clearColor = new BABYLON.Color3(0, 1, 0);
var camera = new BABYLON.ArcRotateCamera("Camera", 1, 0.8, 10, new BABYLON.Vector3(0, 0, 0), scene);
scene.activeCamera.attachControl(canvas);
var light = new BABYLON.PointLight("Omni", new BABYLON.Vector3(0, 100, 100), scene);
var boxa = BABYLON.Mesh.CreateBox("BoxA", 1.0, scene);
boxa.position = new BABYLON.Vector3(0,0.5,0);
var boxb = BABYLON.Mesh.CreateBox("BoxB", 1.0, scene);
boxb.position = new BABYLON.Vector3(3,0.5,0);
boxb.scaling = new BABYLON.Vector3(2,1,2);
var boxc = BABYLON.Mesh.CreateBox("BoxC", 1.0, scene);
boxc.parent = boxb;
boxc.position.z = -3;
var ground = BABYLON.Mesh.CreateGround("ground1", 10, 6, 2, scene);
ground.position = new BABYLON.Vector3(0,0,0);
return scene;
};
var scene = createScene();
engine.runRenderLoop(function() {
scene.render();
});
</script>
</body>
</html>
เอาต์พุต
คำอธิบาย
เราได้สร้าง 3 กล่องในตาข่ายด้านบน ในการสาธิตจะใช้การปรับมาตราส่วน boxb และถูกกำหนดให้เป็นพาเรนต์ให้กับ boxc ซึ่งจะปรับขนาดเนื่องจาก boxb หลักและมาตราส่วนเดียวกัน คุณสามารถเล่นกับการสาธิตเพื่อดูว่าลิงก์ผู้ปกครอง - ลูกทำงานอย่างไร
ในการสร้างตาข่ายคุณต้องใช้แม่ของตาข่ายอื่น -
child.parent = parentmesh;
องค์ประกอบพื้นฐาน - สิ่งแวดล้อม
ตอนนี้ให้เราพูดถึงสภาพแวดล้อมของฉากในส่วนนี้ เราจะพูดถึงscene background color, ambientcolor, skyboxes, fog modeฯลฯ ในฉาก
เราได้เห็นไฟล์ scene background color is demos ซึ่งเราได้สร้างขึ้นจนถึงตอนนี้
ฉากสีพื้นหลัง
ตอนนี้ให้เราดูว่าสีพื้นหลังของฉากทำงานอย่างไร
ไวยากรณ์
ต่อไปนี้เป็นไวยากรณ์สำหรับสีพื้นหลังของฉาก -
scene.clearColor = new BABYLON.Color3(0.5, 0.8, 0.5);
or
scene.clearColor = BABYLON.Color3.Blue();
คุณสมบัติข้างต้นจะเปลี่ยนสีพื้นหลังของฉาก
ฉากสีโดยรอบ
ตอนนี้ให้เราดูว่าสีแวดล้อมของฉากทำงานอย่างไร
ไวยากรณ์
ต่อไปนี้เป็นไวยากรณ์สำหรับสีแวดล้อมของฉาก -
scene.ambientColor = new BABYLON.Color3(0.3, 0.3, 0.3);
AmbientColor ใช้ร่วมกับ StandardMaterialสีและพื้นผิวโดยรอบ หากไม่มี AmbientColor สำหรับฉากนั้นStandardMaterial.ambientColor และ StandardMaterial.ambientTextureไม่มีผลกระทบ StandardMaterial ambientColor / ambientTexture จะใช้งานได้เมื่อใช้ ambientColor สำหรับฉาก โดยค่าเริ่มต้นจะมีการกำหนดฉากscene.ambientColor และตั้งค่าเป็น Color3 (0, 0, 0) ซึ่งหมายความว่าไม่มีสีโดยรอบ
โหมด Scene Fog
ตอนนี้เราจะเข้าใจว่าโหมด Scene Fog ทำงานอย่างไร
ไวยากรณ์
ต่อไปนี้เป็นไวยากรณ์สำหรับโหมดหมอกฉาก
scene.fogMode = BABYLON.Scene.FOGMODE_EXP;
รายการต่อไปนี้ของโหมดหมอกที่มี -
BABYLON.Scene.FOGMODE_NONE - ค่าเริ่มต้นหมอกจะถูกปิดใช้งาน
BABYLON.Scene.FOGMODE_EXP - ความหนาแน่นของหมอกเป็นไปตามฟังก์ชันเลขชี้กำลัง
BABYLON.Scene.FOGMODE_EXP2 - เหมือนกับข้างบน แต่เร็วกว่า
BABYLON.Scene.FOGMODE_LINEAR - ความหนาแน่นของหมอกเป็นไปตามฟังก์ชันเชิงเส้น
หากกำหนดโหมดหมอก EXP หรือ EXP2 คุณสามารถกำหนดความหนาแน่นได้ดังนี้ -
scene.fogDensity = 0.01;
หากโหมดหมอกคือ LINEAR คุณสามารถกำหนดตำแหน่งที่หมอกเริ่มต้นและสิ้นสุดได้ดังนี้ -
scene.fogStart = 20.0;
scene.fogEnd = 60.0;
เพื่อให้สีหมอกดำเนินการตามรหัสต่อไปนี้ -
scene.fogColor = new BABYLON.Color3(0.9, 0.9, 0.85);
Skybox
Skybox เป็นวิธีการสร้างฉากหลังในเกมที่ทำให้ฉากดูสมจริง มันเป็นมากกว่ากระดาษห่อรอบหน้าจอของคุณซึ่งครอบคลุมพื้นผิวที่ใช้สำหรับวัสดุ เลือกภาพของคุณอย่างเหมาะสมเพื่อให้ดูสมจริงสำหรับฉากที่คุณต้องการสร้าง ในการสร้าง skybox คุณต้องสร้างกล่องและใช้วัสดุกับมัน เราจะพูดถึงเนื้อหาต่างๆโดยละเอียดในบทต่อไป
ตอนนี้เราจะดูวิธีสร้าง skybox โดยใช้กล่องและวัสดุ
var skybox = BABYLON.Mesh.CreateBox("skyBox", 100.0, scene);
เราจะสร้างกล่องขนาด 100 เพื่อให้ครอบคลุมฉากทั้งหมด เราจะเริ่มด้วยการให้วัสดุในกล่องซึ่งทำได้ดังนี้ -
var skyboxMaterial = new BABYLON.StandardMaterial("skyBox", scene);
สำหรับวัสดุนี้เราจะกำหนดคุณสมบัติ
skyboxMaterial.reflectionTexture = new BABYLON.CubeTexture("images/cubetexture/skybox", scene);
เราต้องใช้พื้นผิวสะท้อนซึ่งโดยพื้นฐานแล้วจะใช้ในการสร้างกระจกเหมือนวัสดุ คุณสมบัติพื้นผิวสะท้อนใช้ CubeTexture ซึ่งใช้ภาพเป็นอินพุต เนื่องจากคิวบ์มี 6 ใบหน้ารูปภาพที่จำเป็นสำหรับสกายบ็อกซ์จึงต้องเป็น 6 เช่นภายในจึงต้องจัดเก็บเป็น skybox_nx, skybox_ny, skybox_nz, skybox_px, skybox_py, skybox_pz ภาพที่ใช้สำหรับ skybox วางอยู่ด้านล่าง เป็นใบหน้าของลูกบาศก์ทั้งหกด้าน เมื่อคุณใช้พื้นผิวกับรูปร่างจะให้รายละเอียดของภาพที่ใช้และทำให้ฉากดูสมจริง เราใช้โหมดพิกัดเป็น SKYBOX_MODE ดังที่แสดงด้านล่าง -
skyboxMaterial.reflectionTexture.coordinatesMode = BABYLON.Texture.SKYBOX_MODE;
มีคุณสมบัติอื่น ๆ ที่ใช้สำหรับวัสดุเช่น backfaceCulling, diffuseColor, specularColor, disabledLighting เป็นต้นคุณสมบัติจะอธิบายโดยละเอียดในส่วนวัสดุ
ในการสาธิตเราจะแสดงฉากสภาพแวดล้อมที่สร้างขึ้นโดยใช้สกายบ็อกซ์ทรงกลมที่หมุนในฉากและเครื่องบินที่เคลื่อนที่ไปรอบ ๆ มีการใช้หมอกกับฉากซึ่งคุณจะสังเกตเห็นได้เมื่อหมุน
การสาธิตแสดงฉากสิ่งแวดล้อม
<!doctype html>
<html>
<head>
<meta charset = "utf-8">
<title> Babylon.JS : Demo</title>
<script src = "babylon.js"></script>
<style>
canvas { width: 100%; height: 100%;}
</style>
</head>
<body>
<canvas id = "renderCanvas"></canvas>
<script type = "text/javascript">
var canvas = document.getElementById("renderCanvas");
var engine = new BABYLON.Engine(canvas, true);
var createScene = function() {
var scene = new BABYLON.Scene(engine);
var light = new BABYLON.PointLight("Omni",
new BABYLON.Vector3(10, 50, 50), scene);
var camera = new BABYLON.ArcRotateCamera("Camera", 0.4, 1.2, 20, new BABYLON.Vector3(-10, 0, 0), scene);
camera.attachControl(canvas, true);
var material1 = new BABYLON.StandardMaterial("mat1", scene);
material1.diffuseTexture = new BABYLON.Texture("images/tsphere.jpg", scene);
var sphere = BABYLON.Mesh.CreateSphere("red", 32, 2, scene);
sphere.setPivotMatrix(BABYLON.Matrix.Translation(2, 0, 0));
sphere.material = material1;
// Fog
scene.fogMode = BABYLON.Scene.FOGMODE_EXP;
scene.fogColor = new BABYLON.Color3(0.9, 0.9, 0.85);
scene.fogDensity = 0.01;
//skybox
var skybox = BABYLON.Mesh.CreateBox("skyBox", 100.0, scene);
var skyboxMaterial = new BABYLON.StandardMaterial("skyBox", scene);
skyboxMaterial.backFaceCulling = false;
skyboxMaterial.reflectionTexture = new BABYLON.CubeTexture("images/cubetexture/skybox", scene);
skyboxMaterial.reflectionTexture.coordinatesMode = BABYLON.Texture.SKYBOX_MODE;
skyboxMaterial.diffuseColor = new BABYLON.Color3(0, 0, 0);
skyboxMaterial.specularColor = new BABYLON.Color3(0, 0, 0);
skyboxMaterial.disableLighting = true;
skybox.material = skyboxMaterial;
var spriteManagerPlayer = new BABYLON.SpriteManager("playerManager", "images/plane.png", 8, 1000, scene);
var plane = new BABYLON.Sprite("plane", spriteManagerPlayer);
plane.position.x = -2;
plane.position.y = 2;
plane.position.z = 0;
var alpha = 0;
var x = 2;
var y = 0;
scene.registerBeforeRender(function () {
scene.fogDensity = Math.cos(alpha) / 10;
alpha += 0.02;
sphere.rotation.y += 0.01;
y += 0.05;
if (x > 50) {
x = -2;
}
plane.position.x = -x;
x += 0.02;
});
return scene;
};
var scene = createScene();
engine.runRenderLoop(function() {
scene.render();
});
</script>
</body>
</html>
เอาต์พุต
คำอธิบาย
ในตัวอย่างข้างต้นเราใช้รหัสต่อไปนี้สำหรับหมอก -
scene.fogMode = BABYLON.Scene.FOGMODE_EXP;
scene.fogColor = new BABYLON.Color3(0.9, 0.9, 0.85);
scene.fogDensity = 0.01;
scene.fogMode = BABYLON.Scene.FOGMODE_EXP - ที่นี่ความหนาแน่นของหมอกเป็นไปตามฟังก์ชันเลขชี้กำลัง
scene.registerBeforeRender = ด้วยเหตุนี้ความหนาแน่นของหมอกจึงเปลี่ยนไปดังนี้ -
var alpha = 0;
scene.registerBeforeRender(function () {
scene.fogDensity = Math.cos(alpha) / 10;
alpha += 0.02;
});
ค่าของอัลฟาจะเพิ่มขึ้นเรื่อย ๆ โดย 0.02 เมื่อเป็นแบบวนซ้ำเช่นเดียวกับในฟังก์ชันด้านบน
ที่นี่เราได้เพิ่มภาพสไปรต์ระนาบและเปลี่ยนตำแหน่งด้วยไฟล์ scene.registerBeforeRender ฟังก์ชันดังต่อไปนี้ -
var alpha = 0;
var x = 2;
var y = 0;
scene.registerBeforeRender(function () {
scene.fogDensity = Math.cos(alpha) / 10;
alpha += 0.02;
sphere.rotation.y += 0.01;
y += 0.05;
if (x > 50) {
x = -2;
}
plane.position.x = -x;
x += 0.02;
});
return scene;
};s
เราจะเปลี่ยนแกน x ของระนาบและรีเซ็ตเมื่อถึงมากกว่า 50
นอกจากนี้ทรงกลมยังหมุนตามแกน y สิ่งนี้แสดงในตัวอย่างด้านบนค่านี้เปลี่ยนโดยใช้ sphere.rotation.y
พื้นผิวที่ใช้สำหรับทรงกลมคือ - images/tshphere.jpg. รูปภาพจะถูกเก็บไว้ในรูปภาพ / โฟลเดอร์ในเครื่องและวางไว้ด้านล่างเพื่อใช้อ้างอิง คุณสามารถดาวน์โหลดรูปภาพที่คุณต้องการและใช้ในลิงค์สาธิต
เราต้องการภาพหกภาพสำหรับลูกบาศก์ ภาพจะถูกเก็บไว้ในโฟลเดอร์ images / cubetexture / คุณสามารถดาวน์โหลดภาพใดก็ได้ที่คุณต้องการ แต่เมื่อคุณบันทึกไว้ให้บันทึกเป็น nameoftheimage_nx, nameoftheimage_ny, nameoftheimage_nz, nameoftheimage_px, nameoftheimage_py, nameoftheimage_pz โปรดทราบว่าภาพที่เลือกควรอยู่ในลำดับเพื่อให้พื้นหลังดูสมจริงเหมือนกับภาพที่แสดงสำหรับ skybox
ภาพที่ใช้ในการทำสกายบ็อกซ์มีดังนี้ - images/cubetexture/skybox
skybox_nx
skybox_ny
skybox_nz
skybox_px
skybox_py
skybox_pz