【发布时间】:2019-01-07 02:37:57
【问题描述】:
我一直在尝试在 three.js 中使用画布作为纹理。由于 three.js 要求纹理是 2 的幂,因此画布的宽度和高度设置为 [512, 512] 但是我希望输出画布是非 2 的幂。为了保持缩放,我将高度按纵横比放大,这会使绘制的对象的中心向下移动。我试图通过一些任意数字(即ctx.transform(0, -height/ (1 -(height/width))))将高度转换回来,但无法找到最佳位置。有谁知道如何处理这个问题?
var camera, scene, renderer, mesh, material, ctx, texture, canvas, dimensions;
init();
animate();
function init() {
canvas = document.createElement("canvas")
canvas.width = 512;
canvas.height = 512;
ctx = canvas.getContext("2d");
texture = new THREE.CanvasTexture(canvas)
renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth,window.innerHeight);
document.body.appendChild(renderer.domElement);
camera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1);
scene = new THREE.Scene();
material = new THREE.MeshBasicMaterial({map: texture});
var geometry = new THREE.PlaneBufferGeometry( 2, 2 );
mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);
dimensions = renderer.getSize()
}
function animate() {
ctx.save()
ctx.scale(1, dimensions.width / dimensions.height)
// ctx.translate(0, -height * ??);
ctx.fillStyle = "#FF0000"
ctx.fillRect((canvas.width / 2) - 25, (canvas.height / 2) - 25, 50, 50);
ctx.restore()
texture.needsUpdate = true;
requestAnimationFrame(animate);
renderer.render(scene, camera);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/94/three.min.js"></script>
正方形应该被缩放(仍然是正方形)并居中
【问题讨论】:
-
一个更安全的方法是使用第二个画布,您可以在上面绘制任何您想要的大小的精灵。所以从技术上讲,一个正方形
texture canvas和一个任意形状sprite canvas。然后只需将您的画布混搭到另一个画布上,并在此过程中调整其大小。老实说,我在你的 sn-p 中看不到一个正方形,所以我看不到你想要完成什么。 -
您好,感谢您的回复。 stackoverflow 显示在问题中没有正确显示,所以我把它放在这里:jsfiddle.net/m0pnj6de/4。我想缩放它以保持原来的形状和位置,所以我希望正方形居中,嗯,一个正方形。精灵的想法可能会奏效,但如果可能的话,我宁愿减少绘制调用的数量
标签: javascript html canvas three.js