Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将视频作为纹理与Three.js一起使用_Three.js - Fatal编程技术网

将视频作为纹理与Three.js一起使用

将视频作为纹理与Three.js一起使用,three.js,Three.js,我正在尝试创建一个简单的矩形,使用.mp4视频作为纹理。根据three.js documentation()这应该是直截了当的 当我把视频链接,我得到的是一个黑色的框,没有纹理上。我用jpg图像替换视频,测试了代码,效果很好。有人能解释一下我做错了什么吗 我已经看过一些例子,在这些例子中,视频是通过首先将其链接到视频元素,然后在画布上复制帧来播放的。我想尝试three.js文档中提到的直接方法。将视频视为一系列图像。因此,要在3D对象上“播放”该视频,您必须将该序列的每一帧传递给材质,然后更新该

我正在尝试创建一个简单的矩形,使用.mp4视频作为纹理。根据three.js documentation()这应该是直截了当的

当我把视频链接,我得到的是一个黑色的框,没有纹理上。我用jpg图像替换视频,测试了代码,效果很好。有人能解释一下我做错了什么吗


我已经看过一些例子,在这些例子中,视频是通过首先将其链接到视频元素,然后在画布上复制帧来播放的。我想尝试three.js文档中提到的直接方法。

将视频视为一系列图像。因此,要在3D对象上“播放”该视频,您必须将该序列的每一帧传递给材质,然后更新该材质

好的起点是:

这里:

步骤1: 将视频添加到HTML并“隐藏”它:


是的,我理解并且已经制定了这样的代码。然而,我想通过传递mp4文件链接直接实现视频纹理。虽然我还没有看到任何这样做的例子,或能够使其工作自己,但根据文件在这里是应该是可能的。可能是我误解了文档,目前唯一的方法是使用视频标签并根据帧更新纹理。这是three.js文档中的一个错误,使我认为视频可以直接用作纹理。在irc上讨论过,您所说的似乎是目前唯一可能的解决方案。考虑到KISS规则(保持简单愚蠢),每个人都在尽可能地保持自己的代码整洁,因此,如果有更方便的解决方案,您的问题-它将在某些示例中使用。
<video id="video" playsinline webkit-playsinline muted loop autoplay width="320" height="240" src="some-video.mp4" style="display: none;"></video>
//Get your video element:
const video = document.getElementById('video');

//Create your video texture:
const videoTexture = new THREE.VideoTexture(video);
const videoMaterial =  new THREE.MeshBasicMaterial( {map: videoTexture, side: THREE.FrontSide, toneMapped: false} );
//Create screen
const screen = new THREE.PlaneGeometry(1, 1, 0);
const videoScreen = new THREE.Mesh(screen, videoMaterial);
scene.add(videoScreen);