Chapter 02Planes
Using the CreatePlane
method in the MeshBuilder
class, we can make 2-dimensional planes.
let plane = BABYLON.MeshBuilder.CreatePlane("name", {options}, scene);
The first argument of CreatePlane()
is a String that we can use to retrieve data about the plane and the entire plane mesh later. The second argument is an object that specifies various properties of the plane. The last argument is a reference to the scene in which the plane will be inserted into.
<script> var canvas = document.getElementById("renderCanvas"); var engine = new BABYLON.Engine(canvas, true); function createScene(canvas, engine){ let scene = new BABYLON.Scene(engine); scene.clearColor = new BABYLON.Color3(1, 1, 1); let camera = new BABYLON.ArcRotateCamera("Camera", -Math.PI / 2, Math.PI / 2, 2, BABYLON.Vector3.Zero(), scene); camera.attachControl(canvas, true); let light = new BABYLON.HemisphericLight("light", new BABYLON.Vector3(1, 1, 0), scene); let mat = new BABYLON.StandardMaterial("mat", scene); mat.diffuseColor = new BABYLON.Color3(0, 1, 0); let plane = BABYLON.MeshBuilder.CreatePlane("plane", {sideOrientation: BABYLON.Mesh.DOUBLESIDE}, scene); plane.material = mat; return scene; }; var scene = createScene(canvas, engine); engine.runRenderLoop(function(){ scene.render(); }); window.addEventListener("resize", function(){ engine.resize(); }); </script> <canvas id="renderCanvas"></canvas>
Properties
Size
The size
parameter can be used to specify the length of the sides of the plane. The default value is 1.
Height and Width
To create a plane whose sides have different lengths, we can use the height
and width
parameters, which default to the value of the size
parameter if not included.
<script> var canvas5 = document.getElementById("renderCanvas5"); var engine5 = new BABYLON.Engine(canvas5, true); function createScene5(canvas, engine){ let scene = new BABYLON.Scene(engine); scene.clearColor = new BABYLON.Color3(1, 1, 1); let camera = new BABYLON.ArcRotateCamera("Camera", -Math.PI / 2, Math.PI / 2, 4, BABYLON.Vector3.Zero(), scene); camera.attachControl(canvas, true); let light = new BABYLON.HemisphericLight("light", new BABYLON.Vector3(1, 1, 0), scene); let mat = new BABYLON.StandardMaterial("mat", scene); mat.diffuseColor = new BABYLON.Color3(0, 1, 0); let plane = BABYLON.MeshBuilder.CreatePlane("plane", {height: 3, width: 5}, scene); plane.material = mat; return scene; }; var scene5 = createScene5(canvas5, engine5); engine5.runRenderLoop(function(){ scene5.render(); }); window.addEventListener("resize", function(){ engine5.resize(); }); </script> <canvas id="renderCanvas5"></canvas>
Updatable
If we want the mesh to be able to have its internal geometry changed after creation, we can set the Boolean parameter updatable
equal to true
. The default value is false
.
SourcePlane
The sourcePlane
parameter is an instance of the Plane
class. When the createPlane
method utilizes the sourcePlane
parameter, it creates a 3-dimensional mesh with the same geometry as the plane object.
<script> var canvas1 = document.getElementById("renderCanvas1"); var engine1 = new BABYLON.Engine(canvas1, true); function createScene1(canvas, engine){ let scene = new BABYLON.Scene(engine); scene.clearColor = new BABYLON.Color3(1, 1, 1); let camera = new BABYLON.ArcRotateCamera("camera", -Math.PI / 2, Math.PI / 2, 2, BABYLON.Vector3.Zero(), scene); camera.attachControl(canvas, true); let light = new BABYLON.HemisphericLight("light", new BABYLON.Vector3(1, 1, 0), scene); let abstractPlane = new BABYLON.Plane.FromPositionAndNormal(new BABYLON.Vector3(1, 1, 1), new BABYLON.Vector3(-1, 1, -1)); let mat = new BABYLON.StandardMaterial("mat", scene); mat.diffuseColor = new BABYLON.Color3(0, 1, 0); let plane = BABYLON.MeshBuilder.CreatePlane("plane", {sideOrientation: BABYLON.Mesh.DOUBLESIDE, sourcePlane: abstractPlane}, scene); plane.material = mat; return scene; } var scene1 = createScene1(canvas1, engine1); engine1.runRenderLoop(function(){ scene1.render(); }); window.addEventListener("resize", function(){ engine1.resize(); }); </script> <canvas id="renderCanvas1"></canvas>
let abstractPlane = new BABYLON.Plane.FromPositionAndNormal(new BABYLON.Vector3(1, 1, 1), new BABYLON.Vector3(-1, 1, -1)); let plane = BABYLON.MeshBuilder.CreatePlane("plane", {sideOrientation: BABYLON.Mesh.DOUBLESIDE, sourcePlane: abstractPlane}, scene);
Figure 3 above creates a plane using the FromPositionAndNormal
method in the plane
class. The FromPositionAndNormal
method creates an instance of a plane class from an origin point and a normal. The origin of a mesh is in the center of the mesh.
Side Orientation
The sideOrientation
property allows us to make our plane double-sided. The default value is FRONTSIDE.
The different values for the sideOrientation
property are:
<script> var canvas3 = document.getElementById("renderCanvas3"); var engine3 = new BABYLON.Engine(canvas3, true); function createScene3(canvas, engine){ let scene = new BABYLON.Scene(engine); scene.clearColor = new BABYLON.Color3(1, 1, 1); let camera = new BABYLON.ArcRotateCamera("camera", -Math.PI / 2, Math.PI / 2, 2, BABYLON.Vector3.Zero(), scene); camera.attachControl(canvas, true); let light = new BABYLON.HemisphericLight("light", new BABYLON.Vector3(1, 1, 0), scene); let mat = new BABYLON.StandardMaterial("mat", scene); mat.diffuseColor = new BABYLON.Color3(0, 1, 0); let plane = BABYLON.MeshBuilder.CreatePlane("plane", {sideOrientation: BABYLON.Mesh.DOUBLESIDE}, scene); plane.material = mat; return scene; } var scene3 = createScene3(canvas3, engine3); engine3.runRenderLoop(function(){ scene3.render(); }); window.addEventListener("resize", function(){ engine3.resize(); }); </script> <canvas id="renderCanvas3"></canvas>
FrontUVs and BackUVs
If the mesh is double-sided, we can choose what parts of a texture image to crop and place to the front and back sides of our mesh with the frontUVs
and backUVs
parameters, respectively. The default value is Vector4(0, 0, 1, 1)
for both, which places the entire image on each respective side.
<script> var canvas2 = document.getElementById("renderCanvas2"); var engine2 = new BABYLON.Engine(canvas2, true); function createScene2(canvas, engine){ let scene = new BABYLON.Scene(engine); scene.clearColor = new BABYLON.Color3(1, 1, 1); let camera = new BABYLON.ArcRotateCamera("camera", -Math.PI / 2, Math.PI / 2, 2, BABYLON.Vector3.Zero(), scene); camera.attachControl(canvas, true); let light = new BABYLON.HemisphericLight("light", new BABYLON.Vector3(1, 1, 0), scene); let front = new BABYLON.Vector4(0, 0, 1/6, 1); let back = new BABYLON.Vector4(1/3, 0, 1/6, 1); let mat = new BABYLON.StandardMaterial("mat", scene); mat.diffuseTexture = new BABYLON.Texture("https://assets.babylonjs.com/environments/numbers.jpg", scene); mat.diffuseColor = new BABYLON.Color3(0, 1, 0); let plane = BABYLON.MeshBuilder.CreatePlane("plane", {sideOrientation: BABYLON.Mesh.DOUBLESIDE, frontUVs: front, backUVs: back}, scene); plane.material = mat; return scene; } var scene2 = createScene2(canvas2, engine2); engine2.runRenderLoop(function(){ scene2.render(); }); window.addEventListener("resize", function(){ engine2.resize(); }); </script> <canvas id="renderCanvas2"></canvas>