console
var scene, camera, texture, texture1, geometry, material, mesh, renderer, controls, progress = 0.0
const url1 = 'http://183.192.162.3:21451/mnt1/cloudxr/ftp/test.jpg'
const url = 'http://183.192.162.29:18901/mnt1/clipcloud/ftp/cloudxr/cloudxr.jpg'
function createImgPano() {
scene = new THREE.Scene()
camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 1, 1000)
camera.position.set(1, 0, 0)
let loader = new THREE.TextureLoader();
loader.setCrossOrigin("Anonymous");
texture = new THREE.TextureLoader().load(url,
() => {
texture.image.crossOrigin = 'Anonymous'
texture.wrapS = texture.wrapT = THREE.ClampToEdgeWrapping
texture.minFilter = THREE.NearestFilter
})
texture1 = new THREE.TextureLoader().load(url1,
() => {
texture.image.crossOrigin = 'Anonymous'
texture.wrapS = texture.wrapT = THREE.ClampToEdgeWrapping
texture.minFilter = THREE.NearestFilter
})
geometry = new THREE.SphereBufferGeometry(500, 30, 30);
var vertexShader = `
varying vec2 vUv;
void main()
{
vUv = uv;
vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );
gl_Position = projectionMatrix * mvPosition;
gl_Position.x=-gl_Position.x;
}
`
var fragmentShader = `
uniform sampler2D texture1;
uniform sampler2D texture2;
varying vec2 vUv;
uniform float progress;
uniform float smoothness;
uniform bool opening;
vec4 getFromColor(vec2 uv){
return texture2D(texture1, uv);
}
vec4 getToColor(vec2 uv){
return texture2D(texture2, uv);
}
const vec2 center = vec2(.5, .8);
const float SQRT_2 = 1.414213562373;
vec4 transition (vec2 uv) {
float x=opening?progress:1.-progress;
float juli=0.0;
if(uv.y==1.0 && uv.x<=0.25 ){
juli=distance(center,vec2(0.0,1.0));
}else if(uv.y==1.0 && uv.x>=0.75){
juli=distance(center,vec2(1.0,1.0));
}else{
juli=distance(center,uv);
}
float m=smoothstep(-smoothness,0.,SQRT_2*juli-x*(1.+smoothness));
return mix(getFromColor(uv),getToColor(uv),opening?1.-m:m);
}
void main(void){
gl_FragColor = transition(vUv);
}
`
material = new THREE.ShaderMaterial({
uniforms: {
texture1: {
value: texture,
},
texture2: {
value: texture1,
},
opening: {
type: 'b',
value: true
},
smoothness: {
type: 'f',
value: 0.3,
},
progress: {
type: 'f',
value: progress,
},
},
vertexShader: vertexShader,
fragmentShader: fragmentShader,
side: THREE.DoubleSide,
})
mesh = new THREE.Mesh(geometry, material)
scene.add(mesh)
renderer = new THREE.WebGLRenderer()
renderer.setSize(700, 350)
renderer.setPixelRatio(window.devicePixelRatio)
document.body.append(renderer.domElement)
controls = new THREE.OrbitControls(camera, renderer.domElement)
render()
}
function render() {
window.requestAnimationFrame(render)
renderer.render(scene, camera)
if (progress >= 1.0) {
progress = 0.0
} else {
progress += 0.005
}
material.uniforms.progress.value = progress
}
window.onload = function () {
createImgPano()
}
<html>
<head>
<title>在 ThreeJs 里添加、更新文字</title>
</head>
<body>
</body>
</html>