gpt4 book ai didi

javascript - 在 Three.js 中将图像映射到球体上

转载 作者:可可西里 更新时间:2023-11-01 01:56:07 26 4
gpt4 key购买 nike

我目前正在使用 Three.js 来尝试创建一些东西。我有一个球体,我正在尝试绘制眼球图像 here放在上面。

我遇到的问题是结果如下所示:

Enter image description here

我怎样才能让它在不显得拉伸(stretch)的情况下正确映射?

我创建球体和映射纹理的代码如下:

var geometry = new THREE.SphereGeometry(0.5,100,100);
var material = new THREE.MeshPhongMaterial( { map: THREE.ImageUtils.loadTexture('eyeballmap.jpg',THREE.SphericalRefractionMapping) } );
var eyeball = new THREE.Mesh( geometry, material );
eyeball.overdraw = true;
eyeball.castShadow = true;
scene.add( eyeball );

最佳答案

您问题的答案的关键是 image you linked to .

该图像类似于球形环境映射中使用的 MatCap 图像。

适用于此类环境贴图的着色器是使用球体法线(的函数)作为纹理贴图中的 UV 索引。

<script id="vertex_shader" type="x-shader/x-vertex">

varying vec3 vNormal;

void main() {

vNormal = normal;

gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );

}

</script>

<script id="fragment_shader" type="x-shader/x-fragment">

uniform sampler2D tex;

varying vec3 vNormal;

void main() {

vec2 uv = normalize( vNormal ).xy * 0.5 + 0.5;

vec3 color = texture2D( tex, uv ).rgb;

if ( vNormal.z < - 0.85 ) color = vec3( 0.777, 0.74, 0.74 ); // back of eye

gl_FragColor = vec4( color, 1.0 );

}

</script>
const uniforms = {
"tex": { value: texture }
};

const material = new THREE.ShaderMaterial( {
uniforms : uniforms,
vertexShader : document.getElementById( 'vertex_shader' ).textContent,
fragmentShader : document.getElementById( 'fragment_shader' ).textContent
} );

scene.add( new THREE.Mesh( new THREE.SphereGeometry( 30, 32, 16 ), material ) );

Eye Rendered on Sphere from MatCap Texture

three.js r.147

关于javascript - 在 Three.js 中将图像映射到球体上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21663923/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com