fix: 截图组件

This commit is contained in:
wanganmao
2022-11-02 16:53:41 +08:00
parent bee6be1c26
commit 5ad8e40b66
5 changed files with 131 additions and 790 deletions

View File

@@ -184,7 +184,8 @@
:width="800" :width="800"
@ok="handleOkGlbViewer" @ok="handleOkGlbViewer"
> >
<div ref="viewer" style="width: 100%; height: 500px"></div> <!-- <div ref="viewer" style="width: 100%; height: 500px"></div> -->
<WareViewer ref="viewer" :model="glbViewer.model" style="width: 100%; height: 500px"/>
</a-modal> </a-modal>
<a-modal <a-modal
v-model:visible="sceneViewer.visible" v-model:visible="sceneViewer.visible"
@@ -256,9 +257,11 @@ import { scenes } from "./config3d.mock";
import { buildShopDataDemo } from "./config3d.utils"; import { buildShopDataDemo } from "./config3d.utils";
import SceneSurveyViewer from "./Viewer3D/SceneSurveyViewer"; import SceneSurveyViewer from "./Viewer3D/SceneSurveyViewer";
import { message } from "ant-design-vue"; import { message } from "ant-design-vue";
import WareViewer from "./Viewer3D/WareViewer";
export default { export default {
components: { ConfigCheckBox, SceneSurveyViewer }, components: { ConfigCheckBox, SceneSurveyViewer, WareViewer },
props: { props: {
config: { config: {
type: Object, type: Object,
@@ -323,6 +326,7 @@ export default {
glbViewer: { glbViewer: {
visible: false, visible: false,
container: null, container: null,
model: null,
data: null, data: null,
}, },
sceneViewer: { sceneViewer: {
@@ -365,19 +369,35 @@ export default {
this.$emit("changeConfig", this.configTemp); this.$emit("changeConfig", this.configTemp);
}, },
handleOkGlbViewer() { async handleOkGlbViewer() {
this.glbViewer.container.toBlob(async (blob) => {
const data = await common.cosUpload(blob, blob.name, "", () => {});
this.glbViewer.data = {
url: data.url,
title: data.name,
};
this.configTemp.img_url = data.url; var blob = await this.$refs.viewer.snapshot();
this.configTemp.img_name = data.name;
this.glbViewer.visible = false; console.log(blob);
this.onUpdate();
}); const data = await common.cosUpload(blob, blob.name, "", () => {});
this.glbViewer.data = {
url: data.url,
title: data.name,
};
this.configTemp.img_url = data.url;
this.configTemp.img_name = data.name;
this.glbViewer.visible = false;
this.onUpdate();
// this.glbViewer.container.toBlob(async (blob) => {
// const data = await common.cosUpload(blob, blob.name, "", () => {});
// this.glbViewer.data = {
// url: data.url,
// title: data.name,
// };
// this.configTemp.img_url = data.url;
// this.configTemp.img_name = data.name;
// this.glbViewer.visible = false;
// this.onUpdate();
// });
}, },
downloadUrl() { downloadUrl() {
window.open(this.configTemp.img_url); window.open(this.configTemp.img_url);
@@ -416,6 +436,7 @@ export default {
}); });
}, },
init() { init() {
var url = ""; var url = "";
var ware = this.shelf.wares.find( var ware = this.shelf.wares.find(
(x) => x.planetid == this.configTemp.ware (x) => x.planetid == this.configTemp.ware
@@ -427,82 +448,21 @@ export default {
console.warn("未获取到商品模型"); console.warn("未获取到商品模型");
} }
let container = this.$refs.viewer; fetch(url, {
method: 'get',
responseType: 'blob'
}).then(res => res.blob()).then(res => {
container.innerHTML = ""; let reader = new FileReader()
reader.addEventListener('load', e => {
this.glbViewer.model = {
file: {},
result: e.target.result,
};
}, false)
let width = container.offsetWidth; reader.readAsArrayBuffer(res)
let height = container.offsetHeight; })
//创建场景对象
let scene = new THREE.Scene();
// scene.background = new THREE.Color(0xeeeeee);
//环境光
let light = new THREE.AmbientLight(0x404040, 10);
scene.add(light);
//相机设置
let camera = new THREE.PerspectiveCamera(10, width / height, 0.1, 1000); //透视摄像机
camera.position.set(0, 0, 4); //设置相机位置
camera.lookAt(scene.position); //设置相机方向(指向的场景对象)
// 加载模型
var loader = new GLTFLoader();
loader.load(
url,
function (glb) {
console.log(glb.scene);
glb.scene.traverse(function (child) {
if (child.isMesh) {
child.material.emissive = child.material.color;
child.material.emissiveIntensity = 4;
child.material.emissiveMap = child.material.map;
}
});
glb.scene.position.set(0, -0.09, 0);
scene.add(glb.scene);
},
undefined,
function (error) {
console.error(error);
}
);
// // 辅助坐标系 参数250表示坐标系大小可以根据场景大小去设置
// var axisHelper = new THREE.AxesHelper(250);
// scene.add(axisHelper);
// 创建渲染对象
let renderer = new THREE.WebGLRenderer({
antialias: true,
preserveDrawingBuffer: true,
alpha: true,
});
renderer.setSize(width, height); //设置渲染区域尺寸
// renderer.setClearColor(0xffffffff, 1); //设置背景颜色
// renderer.outputEncoding = THREE.sRGBEncoding
// renderer.toneMapping = THREE.LinearToneMapping;
// renderer.toneMapping = THREE.ReinhardToneMapping;
// renderer.toneMapping = THREE.CineonToneMapping;
renderer.toneMapping = THREE.ACESFilmicToneMapping;
// renderer.toneMappingExposure = 1.2
container.appendChild(renderer.domElement);
this.glbViewer.container = renderer.domElement;
// 执行渲染操作
function animate() {
requestAnimationFrame(animate);
renderer.render(scene, camera); //执行渲染操作
}
//创建控件对象
var controls = new OrbitControls(camera, renderer.domElement);
animate();
}, },
editRelation() { editRelation() {

View File

@@ -3,7 +3,7 @@
</template> </template>
<script> <script>
import { SurveyViewer } from "./shelves.module"; import { SurveyViewer } from "@/views/planetDesign/SceneSurveyViewerPage/shelves.module.js";
export default { export default {
props: ["surveyId", "shopData", "page", "sceneAction", "elCart", "defaultWare", "isLocked"], props: ["surveyId", "shopData", "page", "sceneAction", "elCart", "defaultWare", "isLocked"],

View File

@@ -0,0 +1,80 @@
<template>
<div class="container-previewer-1-"></div>
</template>
<script>
import { Previewer } from "@/views/planetDesign/SceneSurveyViewerPage/shelves.module.js";
export default {
props: ["model"],
mounted: function () {
console.log("## Previewer mounted", this.$el.clientWidth);
this.$nextTick(() => {
console.log("## Previewer mounted - nt", this.$el.clientWidth);
this.tryInitView();
});
},
// updated: function () {
// console.log("## Previewer updated", this.$el.clientWidth)
// },
beforeUnmount: function () {
console.log("## Previewer beforeUnmount");
if (this.previewer_) {
this.previewer_.dispose();
this.previewer_ = null;
}
},
methods: {
tryInitView() {
if (!this.previewer_) {
let container = this.$el;
this.previewer_ = new Previewer({
container,
fov0: 10,
});
this.previewer_.on("loadingCompletion", () => {
console.log("## Previewer loadingCompletion");
this.$emit("onLoadingCompletion");
});
this.previewer_.startup();
}
return this.previewer_;
},
snapshot() {
if (this.previewer_) {
return this.previewer_.snapshot();
} else {
return null;
}
},
},
watch: {
model(newVal, oldVal) {
if (this.previewer_) {
this.previewer_.model = newVal;
}
},
},
};
</script>
<style scoped>
div.container-previewer-1- {
width: 100%;
height: 50vh;
}
div.container-previewer-1-:focus {
outline: none;
}
div.container-previewer-1- >>> canvas:focus {
outline: none;
}
</style>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long