mirror of
https://github.com/xemu-project/xemu-website.git
synced 2026-08-14 08:40:12 -07:00
Add 3d xbox
This commit is contained in:
Vendored
-6
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -13,6 +13,17 @@
|
||||
margin: -5rem 0 0; /* negative fixed header height */
|
||||
}
|
||||
|
||||
#xbox-scene {
|
||||
position: relative;
|
||||
padding-bottom: 100%;
|
||||
border: none;
|
||||
}
|
||||
|
||||
#xbox-scene canvas {
|
||||
position: absolute;
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
#logo-canvas {
|
||||
display: block;
|
||||
@@ -146,9 +157,9 @@
|
||||
<div class="container">
|
||||
<div class="row mt-5">
|
||||
<div class="col-md-6 mt-4 pb-5 pb-md-0 text-center">
|
||||
<img src="xbox_logo.png" id="xbox-logo" class="img-fluid" width=450 />
|
||||
<div id="xbox-scene"></div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="col-md-6 my-auto">
|
||||
<h1 class="display-3">
|
||||
<canvas id="logo-canvas" class="gl-logo"></canvas>
|
||||
<img id="logo-fallback" alt="xemu logo" src="/logo-green-jumbotron.svg" style="height: 1.03em;">
|
||||
@@ -321,20 +332,41 @@ if (platform != undefined) {
|
||||
}
|
||||
</script>
|
||||
|
||||
<script type="text/javascript" src="three.min.js"></script>
|
||||
<script type="text/javascript">
|
||||
|
||||
<script type="importmap">
|
||||
{
|
||||
"imports": {
|
||||
"three": "./three/three.module.js",
|
||||
"three/addons/": "./three/"
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<script type="module">
|
||||
import * as THREE from 'three';
|
||||
import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';
|
||||
import { DRACOLoader } from 'three/addons/loaders/DRACOLoader.js';
|
||||
import { ArcballControls } from 'three/addons/controls/ArcballControls.js';
|
||||
|
||||
const gltf_loader = new GLTFLoader();
|
||||
const draco_loader = new DRACOLoader();
|
||||
draco_loader.setDecoderPath( 'three/loaders/' );
|
||||
draco_loader.setDecoderConfig( { type: 'js' } );
|
||||
gltf_loader.setDRACOLoader( draco_loader );
|
||||
|
||||
var canvas = document.querySelector('#bg-scene');
|
||||
var scene = new THREE.Scene();
|
||||
var camera = new THREE.PerspectiveCamera( 74.5, canvas.offsetWidth/canvas.offsetHeight, 0.1, 1000 );
|
||||
scene.fog = new THREE.Fog('black', 0.2, 2.45);
|
||||
scene.background = new THREE.Color('black');
|
||||
|
||||
var renderer = new THREE.WebGLRenderer();
|
||||
var renderer = new THREE.WebGLRenderer({ antialias: true });
|
||||
renderer.setSize( canvas.offsetWidth, canvas.offsetHeight );
|
||||
renderer.setPixelRatio( window.devicePixelRatio );
|
||||
canvas.appendChild( renderer.domElement );
|
||||
|
||||
const texture = new THREE.TextureLoader().load("mesh_pattern.svg");
|
||||
texture.colorSpace = THREE.SRGBColorSpace;
|
||||
texture.wrapS = THREE.RepeatWrapping;
|
||||
texture.wrapT = THREE.RepeatWrapping;
|
||||
texture.repeat.set( 50, -25 );
|
||||
@@ -343,6 +375,7 @@ const geometry = new THREE.SphereGeometry( 1, 50, 25 );
|
||||
var material = new THREE.MeshBasicMaterial( { map: texture, side: THREE.BackSide } );
|
||||
var sphere = new THREE.Mesh( geometry, material );
|
||||
scene.add( sphere );
|
||||
|
||||
camera.position.z = 0.65;
|
||||
camera.position.x = 0.12;
|
||||
|
||||
@@ -350,7 +383,8 @@ var clock = new THREE.Clock();
|
||||
var render = function () {
|
||||
requestAnimationFrame( render );
|
||||
var t = clock.getElapsedTime();
|
||||
sphere.rotation.y = (Math.PI/10) * Math.sin(t * Math.PI / 50);
|
||||
var s = Math.sin(t * Math.PI / 50);
|
||||
sphere.rotation.y = (Math.PI/10) * s;
|
||||
renderer.render(scene, camera);
|
||||
};
|
||||
render();
|
||||
@@ -359,12 +393,123 @@ window.addEventListener('resize', function(){
|
||||
camera.updateProjectionMatrix();
|
||||
renderer.setSize(canvas.offsetWidth, canvas.offsetHeight);
|
||||
}, false);
|
||||
|
||||
var xbox_canvas = document.querySelector('#xbox-scene');
|
||||
var xbox_scene = new THREE.Scene();
|
||||
// xbox_scene.background = new THREE.Color('black');
|
||||
|
||||
var xbox_camera = new THREE.PerspectiveCamera( 42.5, xbox_canvas.offsetWidth/xbox_canvas.offsetHeight, 0.1, 1000 );
|
||||
|
||||
var xbox_renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });
|
||||
xbox_renderer.setSize( xbox_canvas.offsetWidth, xbox_canvas.offsetHeight );
|
||||
xbox_renderer.setPixelRatio( window.devicePixelRatio );
|
||||
xbox_canvas.appendChild( xbox_renderer.domElement );
|
||||
|
||||
var xbox = null;
|
||||
var xbox_scale = 1;
|
||||
var xbox_sphere_radius = 0.23 * xbox_scale;
|
||||
var xbox_base_color = new THREE.Color(0xA0B020);
|
||||
var xbox_bright_color = new THREE.Color(0xD4E830);
|
||||
var xbox_material = new THREE.MeshStandardMaterial( {
|
||||
color: xbox_base_color,
|
||||
transparent: true,
|
||||
opacity: 0.25,
|
||||
depthTest: false,
|
||||
roughness: 0,
|
||||
});
|
||||
|
||||
gltf_loader.load('xbox.glb', function ( gltf ) {
|
||||
xbox = gltf.scene;
|
||||
xbox.renderOrder = 10;
|
||||
xbox.scale.set(xbox_scale, xbox_scale, xbox_scale);
|
||||
xbox.position.set(0,0.05,0);
|
||||
xbox.rotation.x = 0.14 * Math.PI;
|
||||
xbox.rotation.z = -0.02 * Math.PI;
|
||||
var order = 0;
|
||||
xbox.traverse((o) => {
|
||||
if (o.isMesh) {
|
||||
o.material = xbox_material;
|
||||
o.renderOrder = order;
|
||||
order += 1;
|
||||
}
|
||||
});
|
||||
xbox_scene.add(xbox);
|
||||
});
|
||||
|
||||
const xbox_orb_geometry = new THREE.SphereGeometry( xbox_sphere_radius, 50, 25 );
|
||||
var xbox_orb_material = new THREE.ShaderMaterial( {
|
||||
// https://jsfiddle.net/8n36c47p/4/
|
||||
vertexShader: `
|
||||
varying vec3 vPositionW;
|
||||
varying vec3 vNormalW;
|
||||
void main() {
|
||||
vPositionW = vec3( vec4( position, 1.0 ) * modelMatrix);
|
||||
vNormalW = normalize( vec3( vec4( normal, 0.0 ) * modelMatrix ) );
|
||||
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
||||
}`,
|
||||
fragmentShader: `
|
||||
varying vec3 vPositionW;
|
||||
varying vec3 vNormalW;
|
||||
void main() {
|
||||
vec3 color = vec3(0.5, 1.0, 0.3);
|
||||
vec3 base = vec3(0.1, 0.6, 0.05);
|
||||
vec3 viewDirectionW = normalize(cameraPosition - vPositionW);
|
||||
float f = clamp(pow(1.0 - dot(viewDirectionW, vNormalW), 1.3), 0.0, 1.);
|
||||
gl_FragColor = vec4(mix(base, color, f), f * 0.5);
|
||||
}`,
|
||||
transparent: true,
|
||||
});
|
||||
|
||||
var xbox_orb = new THREE.Mesh( xbox_orb_geometry, xbox_orb_material );
|
||||
xbox_orb.renderOrder = 0;
|
||||
xbox_scene.add( xbox_orb );
|
||||
|
||||
var light_color = new THREE.Color(1,1,1);
|
||||
|
||||
const ambient_light = new THREE.AmbientLight(light_color, 2);
|
||||
xbox_scene.add(ambient_light);
|
||||
|
||||
var point_light = new THREE.PointLight(light_color, 5);
|
||||
point_light.position.set(-1, -0.5, 0.25);
|
||||
xbox_scene.add(point_light);
|
||||
|
||||
xbox_camera.position.z = 0.65;
|
||||
|
||||
var clock = new THREE.Clock();
|
||||
var xbox_render = function () {
|
||||
requestAnimationFrame( xbox_render );
|
||||
var t = clock.getElapsedTime();
|
||||
var s = Math.sin(t * Math.PI / 50);
|
||||
if (xbox != null) {
|
||||
xbox.rotation.y = Math.PI * (0.1 + s / 10);
|
||||
var new_color = new THREE.Color(xbox_base_color);
|
||||
new_color.lerp(xbox_bright_color, Math.abs(Math.sin(t * Math.PI / 4 )));
|
||||
xbox_material.color.set(new_color);
|
||||
}
|
||||
xbox_renderer.render(xbox_scene, xbox_camera);
|
||||
};
|
||||
xbox_render();
|
||||
|
||||
const controls = new ArcballControls( xbox_camera, xbox_renderer.domElement, xbox_scene );
|
||||
|
||||
controls.addEventListener( 'change', function () {
|
||||
xbox_renderer.render( xbox_scene, xbox_camera );
|
||||
} );
|
||||
|
||||
controls.update();
|
||||
|
||||
window.addEventListener('resize', function(){
|
||||
xbox_camera.aspect = xbox_canvas.offsetWidth/xbox_canvas.offsetHeight;
|
||||
xbox_camera.updateProjectionMatrix();
|
||||
xbox_renderer.setSize(xbox_canvas.offsetWidth, xbox_canvas.offsetHeight);
|
||||
}, false);
|
||||
</script>
|
||||
|
||||
<script type="text/javascript" src="gl_logo.js"></script>
|
||||
<script type="text/javascript">
|
||||
function updateNavbarTransparency() {
|
||||
var nav = $(".navbar");
|
||||
var t = $(document).scrollTop() < $("#xbox-logo").offset().top - nav.height();
|
||||
var t = $(document).scrollTop() < $("#xbox-scene").offset().top - nav.height();
|
||||
nav.toggleClass('navbar-transparent', t);
|
||||
}
|
||||
$(document).scroll(updateNavbarTransparency);
|
||||
|
||||
Reference in New Issue
Block a user