[+] Helper function to create a box
This commit is contained in:
@@ -0,0 +1,33 @@
|
|||||||
|
import * as THREE from 'three'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a 3D box geometry made out of dashed lines
|
||||||
|
* @param width
|
||||||
|
* @param height
|
||||||
|
* @param depth
|
||||||
|
*/
|
||||||
|
export function box(width: number, height: number, depth: number): THREE.BufferGeometry
|
||||||
|
{
|
||||||
|
width = width * 0.5
|
||||||
|
height = height * 0.5
|
||||||
|
depth = depth * 0.5
|
||||||
|
|
||||||
|
const geometry = new THREE.BufferGeometry();
|
||||||
|
const position = [];
|
||||||
|
|
||||||
|
for (const x of [-1, 1])
|
||||||
|
for (const y of [-1, 1])
|
||||||
|
for (const z of [-1, 1])
|
||||||
|
{
|
||||||
|
const rx = x * width, ry = y * height, rz = z * depth
|
||||||
|
position.push(rx, ry, rz)
|
||||||
|
position.push(rx * -x, ry, rz)
|
||||||
|
position.push(rx, ry, rz)
|
||||||
|
position.push(rx, ry * -y, rz)
|
||||||
|
position.push(rx, ry, rz)
|
||||||
|
position.push(rx, ry, rz * -z)
|
||||||
|
}
|
||||||
|
|
||||||
|
geometry.setAttribute('position', new THREE.Float32BufferAttribute(position, 3))
|
||||||
|
return geometry
|
||||||
|
}
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
import * as THREE from 'three'
|
||||||
|
import * as helper from "@/animation/Helpers";
|
||||||
|
|
||||||
|
let renderer: THREE.WebGLRenderer, scene: THREE.Scene, camera: THREE.PerspectiveCamera
|
||||||
|
const objects = []
|
||||||
|
|
||||||
|
const config = {
|
||||||
|
background: '#333',
|
||||||
|
|
||||||
|
// Field of vision and cutoff frustum for near and far
|
||||||
|
cam: {fov: 50, near: 1, far: 2000},
|
||||||
|
}
|
||||||
|
|
||||||
|
// ////////////////////
|
||||||
|
// Three.js scene code
|
||||||
|
|
||||||
|
function init(): void
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function update(): void
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// ///////////////////
|
||||||
|
// Three.js meta code
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Start the three.js rendering engine
|
||||||
|
*
|
||||||
|
* @param id: Canvas element id
|
||||||
|
*/
|
||||||
|
export function start(id: string): void
|
||||||
|
{
|
||||||
|
scene = new THREE.Scene()
|
||||||
|
scene.background = new THREE.Color(config.background)
|
||||||
|
|
||||||
|
// Create camera
|
||||||
|
camera = new THREE.PerspectiveCamera(config.cam.fov, window.innerWidth / window.innerHeight,
|
||||||
|
config.cam.near, config.cam.far)
|
||||||
|
camera.position.set(0, 0, 200)
|
||||||
|
camera.lookAt(0, 0, 0)
|
||||||
|
|
||||||
|
// @ts-ignore Create WebGL Renderer
|
||||||
|
renderer = new THREE.WebGLRenderer({canvas: document.getElementById(id), antialias: true})
|
||||||
|
onWindowResize()
|
||||||
|
window.addEventListener('resize', onWindowResize)
|
||||||
|
|
||||||
|
init()
|
||||||
|
animate()
|
||||||
|
}
|
||||||
|
|
||||||
|
function onWindowResize()
|
||||||
|
{
|
||||||
|
camera.aspect = window.innerWidth / window.innerHeight
|
||||||
|
camera.updateProjectionMatrix()
|
||||||
|
|
||||||
|
renderer.setPixelRatio(window.devicePixelRatio)
|
||||||
|
renderer.setSize(window.innerWidth, window.innerHeight)
|
||||||
|
}
|
||||||
|
|
||||||
|
function animate(): void
|
||||||
|
{
|
||||||
|
requestAnimationFrame(animate)
|
||||||
|
update()
|
||||||
|
renderer.render(scene, camera)
|
||||||
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
import * as THREE from 'three'
|
import * as THREE from 'three'
|
||||||
|
import * as helper from "@/animation/Helpers";
|
||||||
|
|
||||||
let renderer: THREE.WebGLRenderer, scene: THREE.Scene, camera: THREE.PerspectiveCamera
|
let renderer: THREE.WebGLRenderer, scene: THREE.Scene, camera: THREE.PerspectiveCamera
|
||||||
const objects = []
|
const objects = []
|
||||||
@@ -15,12 +16,47 @@ const config = {
|
|||||||
|
|
||||||
function init(): void
|
function init(): void
|
||||||
{
|
{
|
||||||
|
const geometryBox = helper.box(50, 50, 50);
|
||||||
|
|
||||||
|
const lineSegments = new THREE.LineSegments(geometryBox, new THREE.LineDashedMaterial({
|
||||||
|
color: 0xffaa00,
|
||||||
|
dashSize: 3,
|
||||||
|
gapSize: 1
|
||||||
|
}));
|
||||||
|
lineSegments.computeLineDistances()
|
||||||
|
|
||||||
|
objects.push(lineSegments)
|
||||||
|
scene.add(lineSegments)
|
||||||
|
|
||||||
|
scene.add(circle(0xffff00, 0, 5))
|
||||||
|
scene.add(circle(0xff00ff, 1, 4))
|
||||||
|
scene.add(circle(0x0000ff, 2, 3))
|
||||||
|
scene.add(circle(0x00ffff, 3, 2))
|
||||||
|
scene.add(circle(0xff0000, 4, 1))
|
||||||
|
}
|
||||||
|
|
||||||
|
function circle(color: number, z: number, r: number)
|
||||||
|
{
|
||||||
|
const geometry = new THREE.CircleGeometry(r, 32)
|
||||||
|
const material = new THREE.MeshBasicMaterial({color})
|
||||||
|
const circle = new THREE.Mesh(geometry, material)
|
||||||
|
circle.position.z = z
|
||||||
|
return circle
|
||||||
}
|
}
|
||||||
|
|
||||||
function update(): void
|
function update(): void
|
||||||
{
|
{
|
||||||
|
const time = Date.now() * 0.001;
|
||||||
|
const obj = camera
|
||||||
|
obj.rotation.y = THREE.MathUtils.lerp(obj.rotation.y, (mouse.x * Math.PI) / 10, 0.1)
|
||||||
|
obj.rotation.x = THREE.MathUtils.lerp(obj.rotation.x, (mouse.y * Math.PI) / 10, 0.1)
|
||||||
|
|
||||||
|
// scene.traverse((object) =>
|
||||||
|
// {
|
||||||
|
// object.rotation.x = 0.25 * time;
|
||||||
|
// object.rotation.y = 0.25 * time;
|
||||||
|
// });
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// ///////////////////
|
// ///////////////////
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import {Options, Vue} from 'vue-class-component';
|
import {Options, Vue} from 'vue-class-component';
|
||||||
import {start} from "@/animation/home";
|
import {start} from "@/animation/Home";
|
||||||
|
|
||||||
@Options({components: {}})
|
@Options({components: {}})
|
||||||
export default class NewHome extends Vue
|
export default class NewHome extends Vue
|
||||||
|
|||||||
Reference in New Issue
Block a user