UVMove
ts
import { Scene3D, Engine3D, AtmosphericComponent, CameraUtil, HoverCameraController, View3D, Object3D, DirectLight, KelvinUtil, MeshRenderer, PlaneGeometry, LitMaterial, Color, BlendMode, ComponentBase, Material, Time, Vector4 } from '@orillusion/core'
import dat from 'dat.gui'
class Sample_UVMove {
scene: Scene3D
lightObj: Object3D
async run() {
await Engine3D.init()
this.scene = new Scene3D()
let sky = this.scene.addComponent(AtmosphericComponent)
let camera = CameraUtil.createCamera3DObject(this.scene)
camera.perspective(60, Engine3D.aspect, 0.01, 5000.0)
camera.object3D.addComponent(HoverCameraController).setCamera(25, -25, 200)
let view = new View3D()
view.scene = this.scene
view.camera = camera
Engine3D.startRenderView(view)
await this.initScene()
sky.relativeTransform = this.lightObj.transform
}
async initScene() {
/******** light *******/
{
let lightObj = (this.lightObj = new Object3D())
lightObj.rotationX = 57
lightObj.rotationY = 347
lightObj.rotationZ = 0
let directLight = lightObj.addComponent(DirectLight)
directLight.lightColor = KelvinUtil.color_temperature_to_rgb(5355)
directLight.intensity = 30
this.scene.addChild(lightObj)
}
{
// add floor
let floor = new Object3D()
let material = new LitMaterial()
material.doubleSide = true
material.baseMap = await Engine3D.res.loadTexture('https://cdn.orillusion.com/textures/diffuse.jpg')
let renderer = floor.addComponent(MeshRenderer)
renderer.material = material
renderer.geometry = new PlaneGeometry(200, 200, 1, 1)
floor.y = -10
this.scene.addChild(floor)
}
{
// add plane
let plane = new Object3D()
let renderer = plane.addComponent(MeshRenderer)
let material = new LitMaterial()
material.baseMap = await Engine3D.res.loadTexture('https://cdn.orillusion.com/particle/T_Fx_Object_229.png')
renderer.material = material
material.blendMode = BlendMode.ADD
renderer.geometry = new PlaneGeometry(100, 100, 1, 1)
this.scene.addChild(plane)
let uvmove = plane.addComponent(UVMoveComponent)
let gui = new dat.GUI()
let f = gui.addFolder('UV Move')
f.add(uvmove.speed, 'x', -1, 1, 0.01);
f.add(uvmove.speed, 'y', -1, 1, 0.01);
f.add(uvmove.speed, 'z', 0.1, 10, 0.01);
f.add(uvmove.speed, 'w', 0.1, 10, 0.01);
f.add(uvmove, 'enable');
f.open()
}
}
}
class UVMoveComponent extends ComponentBase {
private _material: Material;
private readonly _speed: Vector4 = new Vector4(0.1, 0.1, 1, 1);
public get speed(): Vector4 {
return this._speed;
}
public set speed(value: Vector4) {
this._speed.copyFrom(value);
}
start(): void {
let mr = this.object3D.getComponent(MeshRenderer);
if (mr) {
this._material = mr.material;
}
}
onUpdate(): void {
if (this._material) {
let value = this._material.getUniformV4(`transformUV1`);
value.x += Time.delta * this._speed.x * 0.001;
value.y += Time.delta * this._speed.y * 0.001;
value.z = this._speed.z;
value.w = this._speed.w;
this._material.setUniformVector4(`transformUV1`, value);
}
}
}
new Sample_UVMove().run()