File: /var/www/html/www.winghung.com/demo_v6/insertCard.php.bak
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
require_once('../wp-load.php');
session_start();
date_default_timezone_set("Asia/Hong_Kong");
global $wpdb, $sitepress;
$result = $wpdb->get_results("SELECT * FROM `custom_upload_files` WHERE hash = '".$_GET['hash']."' LIMIT 1");
$file = $result[0]->file;
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Box</title>
<style>
body { margin: 0; }
</style>
</head>
<body>
<script async src="https://unpkg.com/es-module-shims@1.3.6/dist/es-module-shims.js"></script>
<script type="importmap">
{
"imports": {
"three": "https://unpkg.com/three@0.130.0/build/three.module.js"
}
}
</script>
<script type="module">
import * as THREE from 'https://cdn.skypack.dev/three@0.130.0';
import { OrbitControls } from 'https://unpkg.com/three@0.130.0/examples/jsm/controls/OrbitControls.js';
var setting = {
'dimension': {
'length':<?php echo $_GET['length'];?>,
'width':<?php echo $_GET['height'];?>,
'height':<?php echo $_GET['width'];?>
},
'iphone': {
'length':7.2,
'width':0.7,
'height':14.7
},
'position': {
'posX':<?php echo 0-($_GET['length']/2)-(5/2);?>,
'posY':0,
'posZ':0
},
'background':{
'color':0x000000,
'opacity':0.1
},
'camera':{
'posX':0,
'posY':<?php echo max($_GET['length'], $_GET['height'], $_GET['width'])*2;?>,
'posZ':0
},
'light':{
'color':0xffffff,
'posX':0,
'posY':10,
'posZ':-20
},
'material':[
{'color':0xffffff, 'opacity':'1.0', 'transparent':false},
{'color':0x000000, 'opacity':'1.0', 'transparent':false},
]
}
const scene = new THREE.Scene();
//scene.background = new THREE.Color( 0xff0000 );
const camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000);
camera.position.set(setting.camera.posX, setting.camera.posY, setting.camera.posZ); // 相機位置
camera.lookAt(scene.position); // 相機焦點
// 建立光源
const pointLight = new THREE.PointLight(0xffffff);
pointLight.position.set(setting.position.posX,30,0);
//scene.add(pointLight);
const spotLight = new THREE.SpotLight( 0xffffff );
spotLight.position.set( setting.position.posX,40,0 );
//scene.add( spotLight );
const ambientLight = new THREE.AmbientLight('#ffffff');
scene.add(ambientLight);
// 建立光源
/*
var pointLight = new THREE.PointLight(0xffffff);
pointLight.position.set(setting.light.posX, setting.light.posY, setting.light.posZ);
scene.add(pointLight);
*/
const renderer = new THREE.WebGLRenderer({ alpha: true });
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.setClearColor(setting.background.color, setting.background.opacity); //預設背景顏色
renderer.shadowMap.enable = true; //陰影效果
document.body.appendChild(renderer.domElement);
const controls = new OrbitControls(camera, renderer.domElement);
const textureLoader = new THREE.TextureLoader();
const image = 'upload/<?php echo $file;?>';
const group = new THREE.Group();
const boxGeometry = new THREE.BoxGeometry(setting.dimension.length, setting.dimension.width, setting.dimension.height);
const boxTexture = textureLoader.load(image);
//const boxMaterial = new THREE.MeshBasicMaterial({map:boxTexture});
var sidePlaneMat = new THREE.MeshPhongMaterial({
map: new THREE.TextureLoader().load(image, tex => {
var repeatX, repeatY;
repeatX = boxGeometry.parameters.height * tex.image.width/ (boxGeometry.parameters.depth * tex.image.height);
//
if (repeatX > 1) { // checked correct
//fill the width and adjust the height accordingly
repeatX = 1;
repeatY = boxGeometry.parameters.height * tex.image.width / (boxGeometry.parameters.depth * tex.image.height );
tex.repeat.set(repeatX, repeatY);
tex.offset.y= (repeatY - 1) / 2 * -1;
} else { // checked correct
//fill the height and adjust the width accordingly
repeatX = boxGeometry.parameters.depth * tex.image.height/ (boxGeometry.parameters.height * tex.image.width);
repeatY = 1;
tex.repeat.set(repeatX, repeatY);
tex.offset.x = (repeatX - 1) / 2 * -1;
}
}),
color: setting.material[0].color,
opacity: setting.material[0].opacity,
transparent: setting.material[0].transparent,
side: THREE.DoubleSide
});
var bottomPlaneMat = new THREE.MeshPhongMaterial({
map: new THREE.TextureLoader().load(image, tex => {
var repeatX, repeatY;
repeatX = boxGeometry.parameters.depth * tex.image.width/ (boxGeometry.parameters.width * tex.image.height);
//
if (repeatX > 1) { // checked correct
//fill the width and adjust the height accordingly
repeatX = 1;
repeatY = boxGeometry.parameters.depth * tex.image.width / (boxGeometry.parameters.width * tex.image.height );
tex.repeat.set(repeatX, repeatY);
tex.offset.y= (repeatY - 1) / 2 * -1;
} else { // checked correct
//fill the height and adjust the width accordingly
repeatX = boxGeometry.parameters.width * tex.image.height/ (boxGeometry.parameters.depth * tex.image.width);
repeatY = 1;
tex.repeat.set(repeatX, repeatY);
tex.offset.x = (repeatX - 1) / 2 * -1;
}
}),
color: setting.material[0].color,
opacity: setting.material[0].opacity,
transparent: setting.material[0].transparent,
side: THREE.FrontSide
});
var frontPlaneMat = new THREE.MeshPhongMaterial({
map: new THREE.TextureLoader().load(image, tex => {
var repeatX, repeatY;
repeatX = boxGeometry.parameters.height * tex.image.width/ (boxGeometry.parameters.width * tex.image.height);
//
if (repeatX > 1) { // checked correct
//fill the width and adjust the height accordingly
repeatX = 1;
repeatY = boxGeometry.parameters.height * tex.image.width / (boxGeometry.parameters.width * tex.image.height );
tex.repeat.set(repeatX, repeatY);
tex.offset.y= (repeatY - 1) / 2 * -1;
} else { // checked correct
//fill the height and adjust the width accordingly
repeatX = boxGeometry.parameters.width * tex.image.height/ (boxGeometry.parameters.height * tex.image.width);
repeatY = 1;
tex.repeat.set(repeatX, repeatY);
tex.offset.x = (repeatX - 1) / 2 * -1;
}
}),
color: setting.material[0].color,
opacity: setting.material[0].opacity,
transparent: setting.material[0].transparent,
side: THREE.DoubleSide
});
var boxMaterial = [
new THREE.MeshBasicMaterial( { transparent: true, opacity: 0, wireframe: true, side: THREE.DoubleSide} ), //sidePlaneMat,
new THREE.MeshBasicMaterial( { transparent: true, opacity: 0, wireframe: true, side: THREE.DoubleSide} ), //sidePlaneMat,
bottomPlaneMat,
new THREE.MeshBasicMaterial( { transparent: setting.material[0].transparent, opacity: setting.material[0].opacity, side: THREE.DoubleSide} ), //bottomPlaneMat,
new THREE.MeshBasicMaterial( { transparent: setting.material[0].transparent, opacity: setting.material[0].opacity, side: THREE.DoubleSide} ), //frontPlaneMat,
new THREE.MeshBasicMaterial( { transparent: true, opacity: 0, wireframe: true, side: THREE.DoubleSide} ), //sidePlaneMat, //frontPlaneMat,
];
const box = new THREE.Mesh(boxGeometry, boxMaterial);
box.position.set(setting.position.posX, setting.position.posY, setting.position.posZ);
//scene.add(box);
group.add(box);
// box edge
const boxEdges = new THREE.EdgesGeometry( boxGeometry );
const boxLine = new THREE.LineSegments( boxEdges, new THREE.LineBasicMaterial( { color: 0xcccccc } ) );
boxLine.position.set(setting.position.posX, setting.position.posY, setting.position.posZ);
group.add(boxLine);
const cardBackGeometry = new THREE.PlaneGeometry(setting.dimension.length, setting.dimension.height);
const cardBackMaterial = new THREE.MeshBasicMaterial( {color: 0xffffff, side: THREE.FrontSide} );
const cardBackPlane = new THREE.Mesh( cardBackGeometry, cardBackMaterial );
cardBackPlane.position.set(setting.position.posX, setting.position.posY+setting.dimension.width/2, setting.position.posZ);
cardBackPlane.rotation.x = Math.PI / 2;
group.add(cardBackPlane);
const phoneGeometry = new THREE.BoxGeometry(setting.iphone.length, setting.iphone.width, setting.iphone.height);
const phoneTexture = textureLoader.load("asset/iphone.png");
var phoneMaterial = [
new THREE.MeshBasicMaterial({
color: setting.material[1].color,
opacity: setting.material[1].opacity,
transparent: setting.material[1].transparent,
}),
new THREE.MeshBasicMaterial({
color: setting.material[1].color,
opacity: setting.material[1].opacity,
transparent: setting.material[1].transparent,
}),
new THREE.MeshBasicMaterial({
color: setting.material[0].color,
opacity: setting.material[0].opacity,
transparent: setting.material[0].transparent,
map: phoneTexture,
}),
new THREE.MeshBasicMaterial({
color: setting.material[1].color,
opacity: setting.material[1].opacity,
transparent: setting.material[1].transparent,
}),
new THREE.MeshBasicMaterial({
color: setting.material[1].color,
opacity: setting.material[1].opacity,
transparent: setting.material[1].transparent,
}),
new THREE.MeshBasicMaterial({
color: setting.material[1].color,
opacity: setting.material[1].opacity,
transparent: setting.material[1].transparent,
}),
];
//const phoneMaterial = new THREE.MeshBasicMaterial({map:phoneTexture});
const phone = new THREE.Mesh(phoneGeometry, phoneMaterial);
phone.position.set(setting.iphone.length/2+5/2, setting.position.posY, setting.position.posZ);
//scene.add(phone);
group.add(phone);
scene.add(group);
/* box helper */
//const boxHelper = new THREE.BoxHelper( box, 0x000000 );
//scene.add( boxHelper );
/* grid helper
const size = 100;
const divisions = 100;
const gridHelper = new THREE.GridHelper( size, divisions );
scene.add( gridHelper );
*/
/* spotlight helper
const spotLightHelper = new THREE.SpotLightHelper( spotLight );
scene.add( spotLightHelper );
*/
/* pointlight helper
const sphereSize = 30;
const pointLightHelper = new THREE.PointLightHelper( pointLight, sphereSize );
scene.add( pointLightHelper );
*/
/* axes helper
const axesHelper = new THREE.AxesHelper( 100 );
scene.add( axesHelper );
*/
/* camera helper
const camerhelper = new THREE.CameraHelper( camera );
scene.add( camerhelper );
*/
//camera.position.z = 5;
function animate(){
//sphere.rotation.x += 0.01;
//sphere.rotation.y += 0.01;
//box.rotation.x += 0.01;
//box.rotation.y += 0.01;
requestAnimationFrame(animate);
controls.update();
renderer.render(scene, camera);
}
// 監聽螢幕寬高來做簡單 RWD 設定
window.addEventListener('resize', function() {
console.log("run");
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
})
animate();
</script>
</body>
</html>