Platforms to show: All Mac Windows Linux Cross-Platform
/Mac64bit/SceneKit/SceneKit Primitives
Required plugins for this example: MBS Mac64bit Plugin, MBS MacBase Plugin, MBS MacCG Plugin, MBS Main Plugin
You find this example project in your Plugins Download as a Xojo project file within the examples folder: /Mac64bit/SceneKit/SceneKit Primitives
This example is the version from Mon, 3rd Feb 2019.
Project "SceneKit Primitives.xojo_binary_project"
Class App Inherits Application
Const kEditClear = "&Delete"
Const kFileQuit = "&Quit"
Const kFileQuitShortcut = ""
EventHandler Sub Open()
#if Target64Bit and TargetMacOS then
// okay
#else
MsgBox "Please switch project to 64-bit and run on MacOS."
#endif
End EventHandler
End Class
Class MainWindow Inherits Window
Control MyControl Inherits SCNControlMBS
ControlInstance MyControl Inherits SCNControlMBS
EventHandler Sub Open()
MyView = me.View
MyScene = new SCNSceneMBS
MyView.scene = MyScene
MyView.backgroundColor = NSColorMBS.blackColor
MyView.autoenablesDefaultLighting = true
Myview.allowsCameraControl = true
End EventHandler
End Control
Control SegmentedControl1 Inherits SegmentedControl
ControlInstance SegmentedControl1 Inherits SegmentedControl
EventHandler Sub Action(itemIndex as integer)
Select case itemIndex
case 0
PrimitvesCircle
case 1
Stairs
case 2
Tree
case 3
Toy
case 4
Graph
End Select
End EventHandler
End Control
Sub Graph()
MyScene = new SCNSceneMBS
MyView.scene = MyScene
const gridSize = 25
dim capsuleRadius as double = 1.0 / (gridSize - 1)
dim capsuleHeight as double = capsuleRadius * 4.0
dim z as double = (-gridSize + 1) * (capsuleRadius)
for row as integer = 0 to gridSize-1
dim x as double = (-gridSize + 1) * (capsuleRadius)
for column as integer = 0 to gridSize-1
dim capsule as new SCNCapsuleMBS( capsuleRadius, capsuleHeight)
dim hue as double = (abs(x * z))
dim color as NSColorMBS = NSColorMBS.colorWithHSV( hue, 1.0, 1.0, 1.0)
capsule.firstMaterial.diffuse.contents = color
dim capsuleNode as new SCNNodeMBS(capsule)
MyScene.rootNode.addChildNode(capsuleNode)
capsuleNode.position = SCNVector3MBS.Vector(x, 0.0, z)
// dim y as double = (squareFunction(x, z))
dim y as double = (sinFunction(x, z))
dim moveUp as SCNActionMBS = SCNActionMBS.moveBy(0, y, 0, 1.0)
dim moveDown as SCNActionMBS = SCNActionMBS.moveBy(0, -y, 0, 1.0)
dim sequence as SCNActionMBS = SCNActionMBS.sequence(array(moveUp,moveDown))
dim repeatedSequence as SCNActionMBS = SCNActionMBS.repeatActionForever(sequence)
capsuleNode.runAction(repeatedSequence)
x = x + 2.0 * (capsuleRadius)
next
z = z + 2.0 * (capsuleRadius)
next
End Sub
Sub PrimitvesCircle()
MyScene = new SCNSceneMBS
MyView.scene = MyScene
redim geometries(-1)
geometries.Append new SCNSphereMBS(1.0)
geometries.Append new SCNPlaneMBS(1.0,1.5)
geometries.Append new SCNBoxMBS(1.0, 1.5, 2.0, 0.0)
geometries.Append new SCNPyramidMBS(2.0, 1.5, 1.0)
geometries.Append new SCNCylinderMBS(1.0, 1.5)
geometries.Append new SCNConeMBS(0.5, 1.0, 1.5)
geometries.Append new SCNTorusMBS(1.0, 0.2)
geometries.Append new SCNTubeMBS(0.5, 1.0, 1.5)
geometries.Append new SCNCapsuleMBS(0.5, 2.0)
dim pi as Double = 3.1415926535
dim angle as double = 0.0
dim radius as double = 4.0
dim count as integer = geometries.Ubound + 1
dim angleIncrement as double = PI * 2.0 / count
for index as integer = 0 to geometries.Ubound
dim hue as double = (index) / (count)
dim color as NSColorMBS = NSColorMBS.colorWithHSV(hue, 1.0, 1.0, 1.0)
dim geometry as SCNGeometryMBS = geometries(index)
geometry.firstMaterial.diffuse.contents = color
dim node as new SCNNodeMBS(geometry)
dim x as double = radius * cos(angle)
dim z as double = radius * sin(angle)
node.position = SCNVector3MBS.Vector(x, 0, z)
MyScene.rootNode.addChildNode(node)
angle = angle + angleIncrement
dim sign as double = -1
if index mod 2 = 0 then
sign = 1
end if
dim move1 as SCNActionMBS = SCNActionMBS.moveBy(0.0, sign * ( 1.0), 0.0, 1.0)
dim move2 as SCNActionMBS = SCNActionMBS.moveBy(0.0, sign * (-1.0), 0.0, 1.0)
dim sequence as SCNActionMBS = SCNActionMBS.sequence(array(move1,move2))
dim repeatedSequence as SCNActionMBS = SCNActionMBS.repeatActionForever(sequence)
node.runAction repeatedSequence
next
End Sub
Sub Stairs()
const numberOfStairs = 20
dim stairWidth as double = 1.0
dim stairHeight as double = 0.2
dim stairLength as double = 0.5
dim z as double = 0.0
dim y as double = 0.0
MyScene = new SCNSceneMBS
for index as integer = 0 to numberOfStairs-1
dim hue as double = (index) / (numberOfStairs)
dim box as new SCNBoxMBS(stairWidth, stairHeight, stairLength, 0.0)
dim stairNode as new SCNNodeMBS(box)
if (index mod 3 = 0) then
stairNode.geometry.firstMaterial.diffuse.contents = NSColorMBS.redColor()
elseif (index mod 3 = 1) then
stairNode.geometry.firstMaterial.diffuse.contents = NSColorMBS.orangeColor()
else
stairNode.geometry.firstMaterial.diffuse.contents = NSColorMBS.purpleColor()
end if
stairNode.position = SCNVector3MBS.Vector(0.0, y, z)
y = y + (stairHeight)
z = z + (stairLength)
MyScene.rootNode.addChildNode(stairNode)
next
MyView.scene = MyScene
MyScene.rootNode.runAction SCNActionMBS.rotateByAngle(3, MyScene.rootNode.localUp, 10)
End Sub
Sub Toy()
MyScene = new SCNSceneMBS
const numberOfTori = 6
dim cylinderRadius as double = 0.5
dim pipeRadius as double = 0.3
dim cylinderHeight as double = 2.5
dim cylinder as new SCNConeMBS( 0.15, cylinderRadius, cylinderHeight)
dim cylinderNode as new SCNNodeMBS(cylinder)
cylinderNode.position = new SCNVector3MBS(0, (cylinderHeight) / 2.0 - (pipeRadius), 0)
MyScene.rootNode.addChildNode(cylinderNode)
dim y as double = 0.0
for index as integer = 0 to numberOfTori-1
dim torus as new SCNTorusMBS(cylinderRadius + pipeRadius, pipeRadius)
dim hue as double = (index) / (numberOfTori)
dim color as NSColorMBS = NSColorMBS.colorWithHSV(hue, 1.0, 1.0, 1.0)
torus.firstMaterial.diffuse.contents = color
torus.firstMaterial.transparency = 0.8
dim torusNode as new SCNNodeMBS(torus)
torusNode.position = SCNVector3MBS.Vector(0.0, y, 0.0)
MyScene.rootNode.addChildNode(torusNode)
y = y + (pipeRadius)
cylinderRadius = cylinderRadius * 0.8
pipeRadius = pipeRadius * 0.8
y = y + (pipeRadius)
next
MyView.scene = MyScene
End Sub
Sub Tree()
MyScene = new SCNSceneMBS
dim baseHeight as double = 0.8
dim cylinder as new SCNCylinderMBS(0.2, baseHeight)
dim treeBase as new SCNNodeMBS(cylinder)
treeBase.geometry.firstMaterial.diffuse.contents = NSColorMBS.brownColor()
MyScene.rootNode.addChildNode treeBase
const numberOfLevels = 4
dim y as double = (baseHeight / 2.0)
dim bottomRadius as double = 0.8
dim topRadius as double = 0.5
dim leaveHeight as double = 0.4
dim lastLevelHeight as double = 0.6
dim scale as double = 0.8
for i as integer = 0 to numberOfLevels-1
if (i = numberOfLevels - 1) then
topRadius = 0.0
y = y + ((lastLevelHeight - leaveHeight) / 2.0)
leaveHeight = lastLevelHeight
end if
dim cone as new SCNConeMBS(topRadius, bottomRadius, leaveHeight)
dim leavesNode as new SCNNodeMBS(cone)
leavesNode.position = new SCNVector3MBS(0, y, 0)
y = y + (leaveHeight)
leavesNode.geometry.firstMaterial.diffuse.contents = NSColorMBS.greenColor()
treeBase.addChildNode(leavesNode)
'MyScene.rootNode.addChildNode leavesNode
bottomRadius = bottomRadius * scale
topRadius = topRadius * scale
next
MyView.scene = MyScene
End Sub
Shared Function sinFunction(x as Double, z as Double) As Double
return 0.2 * sin(x * 5 + z * 3) + 0.1 * cos(x * 5 + z * 10 + 0.6) + 0.05 * cos(x * x * z)
End Function
Shared Function squareFunction(x as Double, z as Double) As double
return x * x + z * z
End Function
Note "Note"
Based on code found in the tutorial
Introduction To SceneKit – Part 2
https://www.weheartswift.com/introduction-scenekit-part-2/
Property MyScene As SCNSceneMBS
Property MyView As SCNViewMBS
Property geometries() As SCNGeometryMBS
Property geometryNodes() As SCNNodeMBS
End Class
MenuBar MainMenuBar
MenuItem FileMenu = "&File"
MenuItem FileQuit = "#App.kFileQuit"
MenuItem EditMenu = "&Edit"
MenuItem EditUndo = "&Undo"
MenuItem EditSeparator1 = "-"
MenuItem EditCut = "Cu&t"
MenuItem EditCopy = "&Copy"
MenuItem EditPaste = "&Paste"
MenuItem EditClear = "#App.kEditClear"
MenuItem EditSeparator2 = "-"
MenuItem EditSelectAll = "Select &All"
End MenuBar
End Project
See also:
The items on this page are in the following plugins: MBS Mac64bit Plugin.