javascript - Threejs, div InnerWidth và InnerHeight có tự thay đổi sau khi thiết lập chiều rộng và chiều cao của mặt phẳng không?
In lạiTác giả: Vũ trụ không gianThời gian cập nhật: 2023-11-04 07:30:39254
Xin chào, tôi có một câu hỏi.
Tôi đang cố gắng đặt InnerWidth và InnerHeight của div, một vùng chứa bên trong Canvas, bằng cách sử dụng mã sau, mã quan trọng là hàm Loader.load bên trong, được thực thi trên trang khi chúng tôi tải xong máy bay.
// lớp này xử lý tải và canvas cho một nrrd // Sử dụng lập trình dựa trên nguyên mẫu: https://javascript.info/class // Lớp này cần được cải thiện: // - Chiều rộng và chiều cao của canvas
// điều này nên được thay đổi. cửa sổ; this.container.innerHeight = 600; this.container.innerWidth = 800;
// Những câu lệnh này nên được thay đổi để cải thiện vị trí hình ảnh this.máy ảnh = THREE.PerspectiveCamera mới (60, this.container.innerWidth / this.container.innerHeight, 0,01, 1e10); this.máy ảnh.position.z = 300;
hãy để cảnh = THREE.Scene mới(); scene.add(this.Camera);
// ánh sáng
hãy dirLight = new THREE.DirectionalLight(0xffffff); dirLight.position.set(200, 200, 1000).n normalize();
this.renderer = new THREE.WebGLRenderer({alpha: true}); this.renderer.setPixelRatio(this.container.devicePixelRatio); cửa sổ; this.container.appendChild(this.renderer.domElement); }.bind(this));
},
hoạt hình: hàm () {
this.renderer.render(this.scene, this.Camera); }
}
Như bạn có thể thấy, tôi đã ràng buộc điều này trong lệnh gọi không đồng bộ Loader.load vì chúng ta muốn truy cập this.container bên trong nó, đây là một thuộc tính trong lớp InitCanvas.
Sau đó ta lấy chiều rộng và chiều cao của máy bay vừa được chất hàng bằng cách sử dụng câu lệnh:
Và tôi đã thấy khi sử dụng trình gỡ lỗi web, nó tải chiều rộng và chiều cao của mặt phẳng vào vùng chứa, vào div:
Chúng tôi thấy rằng this.container.innerWidth đang thay đổi thành 3128 và this.container.innerHeight đang thay đổi thành 1760.
Nhưng sau đó chúng ta thấy rằng div vùng chứa được hiển thị phẳng có kích thước 300x150:
Làm thế nào điều này có thể xảy ra?
此外,Tại sao bảng điều khiển web lại báo cáo chúng tôi:
Uncaught TypeError: Không thể đọc thuộc tính 'kết xuất' không xác định tại InitCanvas.animate (InitCanvas.js:79) tại animate (logic.js:63)
Tôi nghĩ điều này là do chúng ta có quyền truy cập this.renderer vào hàm Loader.load vì chúng ta có liên kết (cái này), nhưng trong hàm animate(), phạm vi lớp của InitCanvas đã bị mất.
Làm thế nào để chúng ta giải quyết nó?
Cảm ơn sự giúp đỡ của bạn!
Mã bổ sung có liên quan:
logic.js
if (!Detector.webgl) Detector.addGetWebGLMessage();
// biến toàn cục cho tập lệnh này hãy để OriginalImg, SegmentImg;
var mouse = new THREE.Vector2(); var raycaster = new THREE.Raycaster(); var mousePressed = false; var clickCount = 0;
init(); animate();
// khởi tạo trang function init() { let filename = "models/nrrd/columna01.nrrd"; // thay đổi tập tin nrrd của bạn hãy để idDiv = 'bản gốc'; OriginalImg = initCanvas mới (idDiv, tên tệp); OriginalImg.init(); console.log(OriginalImg);
filename = "models/nrrd/columnasegmentado01.nrrd"; // thay đổi tệp nrrd của bạn idDiv = 'đoạn'; SegmentImg = new InitCanvas(idDiv, filename); SegmentImg.init(); }
body { họ phông chữ: Monospace; lề: 0px; tràn: ẩn; }
#thông tin { màu sắc: rgb(137, 145, 192); position: absolute; trên cùng: 10px; width: 100%; text-align: center; chỉ số z: 5; display:block; }
.cột { nổi: trái; chiều rộng: 50%; }
/* Xóa các float sau các cột */ .row:sau { nội dung: ""; display: table; rõ ràng: cả hai; }
canvas { width: 200px; chiều cao: 200px; lề: 100px; phần đệm: 0px; vị trí: tĩnh; /* cố định hoặc tĩnh */ trên cùng: 100px; trái: 100px; }
EDIT: Tôi đã thực hiện những gì @ Mugen87 đã nói với chúng tôi, điều này làm cho Canvas có chiều rộng và chiều cao của mô hình được tải. Nhưng không ngờ mô hình lại bị lệch khỏi phần Canvas ở góc trên bên trái. Nó hiển thị ở góc dưới bên phải, ẩn hầu hết nội dung do không có thanh cuộn.
Làm cách nào chúng ta có thể thêm thanh cuộn vào trang để nhìn rõ Canvas?
Tôi cũng đã đăng mã ở đây để thay đổi kích thước Canvas theo đề xuất của @ Mugen87:
hãy để trình tải = new THREE.NRRDLoader(); Loader.load(this.Filename, function (volume) {
//z mặt phẳng đặt sliceZ = Volume.extractSlice('z', Math.floor(volume.RASDimensions[2] / 4));
Chỉ thay đổi kích thước vùng chứa sẽ không thay đổi kích thước trình kết xuất. Bạn phải gọi renderer.setSize(chiều rộng, chiều cao); Nếu không thì kích thước của Canvas tương ứng không thay đổi.
此外,thiết bịPixelRatio 是一个window tài sản. this.container.devicePixelRatio trở lại undefined.
Về javascript - Threejs, div InnerWidth và InnerHeight có tự thay đổi sau khi thiết lập chiều rộng và chiều cao của mặt phẳng không? , chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/49445460/
Đã thử sử dụng trình chỉnh sửa biểu mẫu được tích hợp vào QTCreator nhưng ngay cả khi tôi đặt plugin vào QtCreator.app/Contents/MacOS/designer thì nó cũng không hiển thị. Tuy nhiên, cùng một tệp dylib hoạt động độc lập
Trong ví dụ mã này. Điều gì sẽ được đọc sau "this.method2();"? Nó có chuyển sang phương thức 2() trước khi trả về Giá trị trả về không? phương thức int công khai1(int returnV
Dự án của tôi có các phần phụ thuộc được định cấu hình thông qua gradle. Tôi muốn thêm các phần phụ thuộc sau: nhóm biên dịch: 'org.restlet.jse', tên: 'org.restlet.ext.apispark', v
Tôi sẽ chuyển phần mềm quản lý khách hàng trên Windows sang phần mềm trên Web. Tôi thấy rằng polymer có thể là một lựa chọn. Tuy nhiên, để sử dụng, chúng tôi không thể tìm thấy thành phần polymer với Chế độ xem bảng, menu thả xuống
Có một thư mục trong thư mục dự án của tôi Dự án, chẳng hạn như thư mục ED, khi tôi chỉ định trong Eclipse nơi tìm các tệp tôi viết File file = new File("ED/text.txt");
Đây là điều kỳ lạ, nó hoạt động: $('#box').css({"backgroundPosition": "0px 250px"}); nhưng nó không hoạt động, nó chỉ không thay đổi vị trí: $('# hộp') .animate
Câu hỏi này đã có câu trả lời ở đây: Hàm strcmpi có trong thư viện tiêu chuẩn C của ISO không? (3 câu trả lời) Đã đóng cửa 8 năm trước. Tôi có một câu hỏi tại sao
Tôi hiện đang sử dụng gói lưu trữ được chia sẻ và tôi không chắc nó đang sử dụng phiên bản MySQL nào, nhưng có vẻ như nó không hỗ trợ loại DATETIMEOFFSET. Có phiên bản MySQL nào hỗ trợ DATETIMEOFFSET không? Hoặc có kế hoạch
Khi nghiên cứu Seam 3, tôi phát hiện ra rằng Seam Solder cho phép áp dụng chú thích @Named cho các gói - trong trường hợp này, tất cả các hạt trong gói sẽ tự động được đặt tên như thể chúng được @Named. Tôi không thấy
Tôi biết rằng .append đôi khi sẽ tăng dung lượng của mảng và tạo thành một bản sao mới của mảng, nhưng .removeLast sẽ đảo ngược điều này và giảm dung lượng của mảng bằng cách sao chép sang một mảng mới nhỏ hơn? Câu trả lời tốt nhất là không (hoặc ít nhất nếu có thì đó là một lỗi
Thật khó để nói những gì để hỏi ở đây. Câu hỏi không rõ ràng, mơ hồ, không đầy đủ, quá rộng hoặc hùng biện và không thể trả lời hợp lý ở dạng hiện tại. Để được trợ giúp làm rõ vấn đề này để có thể mở lại, hãy truy cập trung tâm trợ giúp Đóng 1.
Công cụ xác định hàm noException có nhằm mục đích tăng hiệu suất hay không, vì có thể không có mã trong đối tượng được tạo để ghi lại các ngoại lệ, do đó, nó phải được thêm vào các khai báo và định nghĩa hàm bất cứ khi nào có thể? Lần đầu tiên tôi nghĩ đến một trình bao bọc cho các đối tượng có thể gọi được, trong đó không có ngoại lệ nào có thể tạo ra
Tôi đang sử dụng Angularjs 1.3.7 và mới phát hiện ra rằng Promise.all không cập nhật Chế độ xem Angularjs sau khi phản hồi thành công, trong khi $q.all thì có. Vì Lời hứa được bao gồm trong bản gốc
Tôi đang viết một thư viện vectơ đồ chơi (vật lý) và tôi đang gặp phải một vấn đề trong đó GHC khẳng định rằng các hàm phải có Integer. là kiểu của họ. Tôi muốn nhân vectơ với vectơ cũng như đại lượng vô hướng (chỉ sử dụng * ), mặc dù điều này có thể đạt được bằng cách chỉ sử dụng Vector
Tôi đã thử kết xuất dữ liệu của mình qua tập lệnh php nhưng không có dòng lệnh. Vì vậy, tôi đã tạo tệp .sql của mình bằng cách sử dụng tập lệnh này và sau đó tôi đã thử sử dụng tập lệnh của mình: $link = mysql_connect($host, $u
Tôi là một lập trình viên xuất sắc, rất giỏi!