- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
你好,我有一个疑问。
我正在尝试设置 div 的 innerWidth 和 innerHeight, Canvas 内部的容器,使用以下代码,重要的代码是内部 loader.load 函数,当我们完成飞机加载时执行在页面中。
// this class handles the load and the canva for a nrrd
// Using programming based on prototype: https://javascript.info/class
// This class should be improved:
// - Canvas Width and height
InitCanvas = function (IdDiv, Filename) {
this.IdDiv = IdDiv;
this.Filename = Filename
}
InitCanvas.prototype = {
constructor: InitCanvas,
init: function () {
this.container = document.getElementById(this.IdDiv);
// this should be changed.
debugger;
this.container.innerHeight = 600;
this.container.innerWidth = 800;
//These statenments should be changed to improve the image position
this.camera = new THREE.PerspectiveCamera(60, this.container.innerWidth / this.container.innerHeight, 0.01, 1e10);
this.camera.position.z = 300;
let scene = new THREE.Scene();
scene.add(this.camera);
// light
let dirLight = new THREE.DirectionalLight(0xffffff);
dirLight.position.set(200, 200, 1000).normalize();
this.camera.add(dirLight);
this.camera.add(dirLight.target);
// read file
let loader = new THREE.NRRDLoader();
loader.load(this.Filename, function (volume) {
//z plane
let sliceZ = volume.extractSlice('z', Math.floor(volume.RASDimensions[2] / 4));
debugger;
this.container.innerWidth = sliceZ.iLength;
this.container.innerHeight = sliceZ.jLength;
sliceZ.mesh.material.color.setRGB(0,1,1);
console.log('Our slice is: ', sliceZ);
scene.add(sliceZ.mesh);
this.scene = scene;
// renderer
this.renderer = new THREE.WebGLRenderer({alpha: true});
this.renderer.setPixelRatio(this.container.devicePixelRatio);
debugger;
this.container.appendChild(this.renderer.domElement);
}.bind(this));
},
animate: function () {
this.renderer.render(this.scene, this.camera);
}
}
如您所见,我在 loader.load 异步调用中绑定(bind)了 this,因为我们想访问其中的 this.container,它是类 InitCanvas 中的一个属性。
然后我们在获取刚加载完成的飞机的宽高,用语句:
this.container.innerWidth = sliceZ.iLength;
this.container.innerHeight = sliceZ.jLength;
而且我已经看到使用网络调试器它确实将平面的宽度和高度加载到容器中,加载到 div 中:
我们看到 this.container.innerWidth 正在更改为 3128,this.container.innerHeight 正在更改为 1760。
但是,然后我们看到平面渲染后容器 div 是 300x150:
这怎么可能?
此外,为什么我们的网络控制台报告我们:
Uncaught TypeError: Cannot read property 'render' of undefined
at InitCanvas.animate (InitCanvas.js:79)
at animate (logic.js:63)
我认为,这是因为我们确实可以访问 this.renderer 到 loader.load 函数中,因为我们有一个 bind(this),但是在 animate() 函数中,InitCanvas 的类范围已经丢失。
我们如何解决它?
感谢您的帮助!
相关的附加代码:
逻辑.js
if (!Detector.webgl) Detector.addGetWebGLMessage();
// global variables for this scripts
let OriginalImg,
SegmentImg;
var mouse = new THREE.Vector2();
var raycaster = new THREE.Raycaster();
var mousePressed = false;
var clickCount = 0;
init();
animate();
// initilize the page
function init() {
let filename = "models/nrrd/columna01.nrrd"; // change your nrrd file
let idDiv = 'original';
OriginalImg = new InitCanvas(idDiv, filename);
OriginalImg.init();
console.log(OriginalImg);
filename = "models/nrrd/columnasegmentado01.nrrd"; // change your nrrd file
idDiv = 'segment';
SegmentImg = new InitCanvas(idDiv, filename);
SegmentImg.init();
}
let originalCanvas = document.getElementById('original');
originalCanvas.addEventListener('mousedown', onDocumentMouseDown, false);
originalCanvas.addEventListener('mouseup', onDocumentMouseUp, false);
function onDocumentMouseDown(event) {
mousePressed = true;
clickCount++;
mouse.x = ( ( event.clientX - OriginalImg.renderer.domElement.offsetLeft ) / OriginalImg.renderer.domElement.clientWidth ) * 2 - 1;
mouse.y = - ( ( event.clientY - OriginalImg.renderer.domElement.offsetTop ) / OriginalImg.renderer.domElement.clientHeight ) * 2 + 1
console.log('Mouse x position is: ', mouse.x, 'the click number was: ', clickCount);
console.log('Mouse Y position is: ', mouse.y);
raycaster.setFromCamera(mouse.clone(), OriginalImg.camera);
var objects = raycaster.intersectObjects(OriginalImg.scene.children);
console.log(objects);
}
function onDocumentMouseUp(event) {
mousePressed = false
}
function animate() {
requestAnimationFrame(animate);
OriginalImg.animate();
SegmentImg.animate();
}
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<title>Prototype: three.js without react.js</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
<link rel="stylesheet" href="css/styles.css">
<!-- load the libraries and js -->
<script src="js/libs/three.js"></script>
<script src="js/Volume.js"></script>
<script src="js/VolumeSlice.js"></script>
<script src="js/loaders/NRRDLoader.js"></script>
<script src="js/Detector.js"></script>
<script src="js/libs/stats.min.js"></script>
<script src="js/libs/gunzip.min.js"></script>
<script src="js/libs/dat.gui.min.js"></script>
<script src="js/InitCanvas.js"></script>
</head>
<body>
<div id="info">
<h1>Prototype: three.js without react.js</h1>
</div>
<!-- two canvas -->
<div class="row">
<div class="column" id="original">
</div>
<div class="column" id="segment">
</div>
</div>
<script src="js/logic.js"></script>
</body>
</html>
样式.css
body {
font-family: Monospace;
margin: 0px;
overflow: hidden;
}
#info {
color: rgb(137, 145, 192);
position: absolute;
top: 10px;
width: 100%;
text-align: center;
z-index: 5;
display:block;
}
.column {
float: left;
width: 50%;
}
/* Clear floats after the columns */
.row:after {
content: "";
display: table;
clear: both;
}
canvas {
width: 200px;
height: 200px;
margin: 100px;
padding: 0px;
position: static; /* fixed or static */
top: 100px;
left: 100px;
}
编辑:我已经完成@Mugen87 告诉我们的操作,它使 Canvas 具有加载模型的宽度和高度。但是我没想到模型会从左上角的 Canvas 部分偏移。它显示在右下角,由于没有滚动条,它隐藏了大部分内容。
我们如何向页面添加滚动条才能清楚地看到 Canvas ?
我还在这里发布了按照@Mugen87 的建议调整 Canvas 大小的代码:
let loader = new THREE.NRRDLoader();
loader.load(this.Filename, function (volume) {
//z plane
let sliceZ = volume.extractSlice('z', Math.floor(volume.RASDimensions[2] / 4));
debugger;
this.container.innerWidth = sliceZ.iLength;
this.container.innerHeight = sliceZ.jLength;
this.renderer.setSize(this.container.innerWidth, this.container.innerHeight);
sliceZ.mesh.material.color.setRGB(0,1,1);
console.log('Our slice is: ', sliceZ);
scene.add(sliceZ.mesh);
}.bind(this));
最佳答案
只是调整容器的大小不会调整渲染器的大小。您必须调用 renderer.setSize( width, height );
否则相应 Canvas 的大小保持不变。
此外,devicePixelRatio
是一个window
属性。 this.container.devicePixelRatio
返回 undefined
。
关于javascript - Threejs,div innerWidth 和innerHeight 设置平面的宽度和高度后会自行改变吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49445460/
当用户滚动到底部时,我正在尝试执行某些操作。 这段代码可以在桌面上运行。 但是在我的 Android 4.3 Google Chrome 和 iPhone Safari 上,它没有将 if 语句解析为
我正在使用 jQuery 2.0.3 问题: $(window).innerHeight() 返回零。 但是 window.innerHeight 返回正确的高度。 控制台中的行为相同。 此问题仅存在
我有一个隐藏的子导航,高度设置为 0。该 div 内部是子导航的几个部分。 我获取被单击部分的名称,然后获取该 div 的内部高度。然后使用该高度,将 .sub_navigation 高度从 0 动画
我有一个事件监听器,如下所示: window.addEventListener("resize", function(data){ console.log(data); // Do s
我有一些依赖于window.innerHeight的计算。但据我发现,这在 IE9 之前的任何 IE 中都不可用。我看过的所有其他选项甚至都没有接近我使用 window.innerHeight 时得到
背景 我正在尝试优化我的 JavaScript,减少对 DOM 的调用并使用更少的计算值。 问题 使用值window.innerHeight时,该值是每次计算还是来自初始计算? 示例 是这个吗 let
相当于window.innerHeight的jquery是什么 我试过了 $(window).innerHeight() 和 $(window).height() 但是两者都没有给我我想要的值。他们返
有人可以解释一下为什么设置 height 吗?视口(viewport)属性: 没用?window.innerWidth报告 480px 但是 window.innerHeight 210,不仅仅是
当我设置width=device-width视口属性时,它作为-window.innerWidth由设备相应地更改,但是当我更改height=device-height时它不起作用-window.in
我正在使用 bootstrap 编写一个响应式网站,我只想要一个与屏幕实际大小相同的元素。 每当我执行 height/width: 100% 时,浏览器都会给我一个滚动条,因为它会将我的视口(view
我正在这里处理一些 javascript svg 图形,我发现我真的不能依赖 Firefox 上 window.innerHeight(或outerHeight)的值。我正在运行 Ubuntu 12.
我正在使用 window.onresize 来监听视口(viewport)大小的变化,这样我就可以适本地缩放我的内容(这是一个游戏 UI,所以使用 window.onresize + css scal
我正在测试我的一个 friend 注意到的一个测试用例。他在循环中使用 window.innerheight,fps 出现了非常显着的下降。 这是我创建的用于测试它的 jsperf 的链接 http:
我正在实现一个以 html/css/js 为中心的叠加层,即使用户在页面上放大和缩小时它也保持居中。 在 iOs Chrome、iOs Safari、Default Android 和 Android
我的测试手机之一是 Galaxy S3 Mini。这部手机的规范说它是 800x480 分辨率。 但是,当我在我的 HTML 游戏中执行以下操作时: window.innerWidth window.
window.innerHeight 是的,它将返回移动设备上浏览器的高度值。然而,当用户尝试通过捏合来放大或缩小时,问题就会出现(在某些浏览器上)。该值将无法正确调整,而是仍然返回页面的完整长度。
CSS 代码: #jpspm { position: relative; top: -83px; left: -1px; padding-top: 3px; p
我正在尝试根据它的高度确定 div (.content) 的顶部/底部填充,并根据窗口的加载和调整大小重新计算它。这应该与旁边的另一个 div (.character) 很好地居中对齐。 我试过使用
对于某些人来说,这可能是一个非常愚蠢的问题,但我肯定无法理解这背后的问题。代码相当简单,如下所示: HTML: ####
我有一个 header ,其高度等于窗口的 innherheight。不过,这会使页眉的子元素处于相同的位置,就好像页眉的高度未定义一样。我想将一个特定的 child 放在标题的底部,而不管它的高度如
我是一名优秀的程序员,十分优秀!