针对上一篇博文抛出的问题,下面来说说如何解决
我们知道三维场景是可以随意旋转角度的,所以我们的动态贴图一定不能将角度写死,或者说我们需要将动态贴图跟随场景的旋转而旋转,这样就能达到动态贴图的正面始终面向我们的效果,这样就不会出现当场景旋转至某一角度时看不见动态贴图的现象了。
但是想想这样并不好实现,那该如何是好呢?
试想,我们知道相机在三维场景中就相当于一双眼睛一样,它在哪个位置我们就可以看到场景中哪个位置的物体。这么说,我们就可以通过相机来实现我们的功能了,只需将动态贴图始终跟随相机的角度就可以达到我们想要的效果了,接下来看看如何来实现。
这里只讲如何解决问题,相关配置还是参考上一篇文章
点击这里去查看动态贴图的实现方式:https://blog.csdn.net/bigpatten/article/details/123180658
// 实现纹理动画的函数
function TextureAnimator(texture, tilesHoriz, tilesVert, numTiles, tileDispDuration) {
let tilesHorizontal = tilesHoriz
let tilesVertical = tilesVert
let numberOfTiles = numTiles
texture.wrapS = texture.wrapT = THREE.RepeatWrapping
texture.repeat.set(1 / tilesHorizontal, 1 / tilesVertical)
let tileDisplayDuration = tileDispDuration
let currentDisplayTime = 0
let currentTile = 0
this.update = function(milliSec) {
currentDisplayTime += milliSec
// 关键代码 设置动态贴图跟随相机转动
if (that.camera) {
annie.lookAt(that.camera.position)
runner.lookAt(that.camera.position)
}
while (currentDisplayTime > tileDisplayDuration) {
currentDisplayTime -= tileDisplayDuration
currentTile++
if (currentTile == numberOfTiles) currentTile = 0
let currentColumn = currentTile % tilesHorizontal
texture.offset.x = currentColumn / tilesHorizontal
let currentRow = Math.floor(currentTile / tilesHorizontal)
texture.offset.y = currentRow / tilesVertical
}
}
}
注意上方关键代码处即是实现我们解决问题的代码,我们只需要将贴图设置为始终看向相机的方向就即可。