原始html和vue中使用3dmol js展示分子模型,pdb文件

 软件:

3dmol.js  https://3dmol.csb.pitt.edu/doc/

原始html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>wechat</title>
    <meta http-equiv="Access-Control-Allow-Origin" content="*" />
    <meta http-equiv="Content-Security-Policy"  content="upgrade-insecure-requests">
  <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
  <!-- 3d模型展示 -->
  <script src="https://3Dmol.org/build/3Dmol-min.js"></script>     
  <script src="https://3Dmol.org/build/3Dmol.ui-min.js"></script>   

  </head>
  <body>
    <div>
    <input type="file" name="file" value="上传文件" onchange="addFile(this)" />
      <div id="container-01" style="height: 400px; width: 400px; position: relative;" class='viewer_3Dmoljs' data-pdb='2POR' data-backgroundcolor='0xffffff' data-style='stick' data-ui='true'></div>
    </div>
  </body>
</html>
<style>
  .mol-container {
    width:    75%;
    height:   400px;
    position: relative;
  }
  </style>

<script>
  function addFile(that){
        var input = that;
        var reader = new FileReader();
        reader.readAsText(input.files[0]);
        reader.onload = function() {
            var pdbData = reader.result;
            // 创建3Dmol对象
            let element = $('#container-01');
            var viewer = $3Dmol.createViewer(element, {
                defaultcolors : $3Dmol.rasmolElementColors
            });

            // 添加分子
            viewer.addModel(pdbData, "pdb");
            // viewer.addModel(pdbData, "pdb").setStyle({}, {"cartoon": { color: '#17ac80'} });
            // viewer.addSurface($3Dmol.SurfaceType.VDW, {'opacity':0.5, color: 'white'});

            // 旋转分子
            viewer.spin("y",1);
            // 在HTML页面中显示分子
            viewer.zoomTo();
            viewer.render();
        }
    }
  </script>

vue + element ui

index.html中引入js
     <!-- 3d模型展示 -->
  <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
  <script src="https://3Dmol.org/build/3Dmol-min.js"></script>     
  <script src="https://3Dmol.org/build/3Dmol.ui-min.js"></script> 
vue文件中
<template>
  <div class="content">
    <el-upload
      ref="upload"
      action="alert"
      :auto-upload="false"
      :file-list="uploadFiles"
      :on-change="loadJsonFromFile"
    >
      <el-button slot="trigger" size="small" type="primary">选取文件</el-button>
    </el-upload>
    <div
      id="container-01"
      style="height: 400px; width: 400px; position: relative"
      class="viewer_3Dmoljs"
      data-pdb=""
      data-backgroundcolor="0xffffff"
      data-style="stick"
      data-ui="true"
    ></div>
  </div>
</template>
<script>
export default {
  components: {},
  data() {
    return {
      uploadFiles: [],
    };
  },
  created() {},
  methods: {
    readFile(filePath) {
      // 创建一个新的xhr对象
      let xhr = null;
      if (window.XMLHttpRequest) {
        xhr = new XMLHttpRequest();
      } else {
        xhr = new ActiveXObject("Microsoft.XMLHTTP");
      }
      const okStatus = document.location.protocol === "file" ? 0 : 200;
      xhr.open("GET", filePath, false);
      xhr.overrideMimeType("text/html;charset=utf-8");
      xhr.send(null);
      return xhr.status === okStatus ? xhr.responseText : null;
    },
    //element删除组件上传文件成功
    loadJsonFromFile(file, fileList) {
      this.uploadFiles = fileList;
      this.submit();
    },
    submit() {
      // 解析上传的文件
      let file = this.uploadFiles[0];
      let reader = new FileReader();
      reader.readAsText(file.raw);
      reader.onload = (e) => {
        // 读取文件内容
        var pdbData = e.target.result;
        // 接下来可对文件内容进行处理
        console.log(pdbData);
        let element = $("#container-01");
        let config = { backgroundColor: "gray" };
        let viewer = $3Dmol.createViewer(element, config);
         添加分子
        viewer
          .addModel(pdbData, "pdb")
          .setStyle({}, { cartoon: { color: "#17ac80" } });
        viewer.addSurface($3Dmol.SurfaceType.VDW, {
          opacity: 0.5,
          color: "white",
        });
        //分子动态围绕y轴旋转
        viewer.spin("y", 2);
        // 在HTML页面中显示分子
        viewer.zoomTo();
        viewer.render();
        viewer.zoom(1, 2000);
      };
    },
  },
};
</script>

<style>
.mol-container {
  width: 75%;
  height: 400px;
  position: relative;
}
</style>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3使用three.js加载fbx模型,可以按照以下步骤进行操作: 1. 首先,在Vue3项目安装three.js和fbx-loader: ``` npm install three fbx-loader --save ``` 2. 在Vue3创建一个Three.js组件,可以参考如下代码: ```javascript <template> <div ref="container"></div> </template> <script> import * as THREE from 'three' import { FBXLoader } from 'three/examples/jsm/loaders/FBXLoader.js' export default { name: 'ThreeScene', mounted() { // 创建场景 this.scene = new THREE.Scene() // 创建相机 this.camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000) this.camera.position.set(0, 0, 5) // 创建渲染器 this.renderer = new THREE.WebGLRenderer({ antialias: true }) this.renderer.setSize(window.innerWidth, window.innerHeight) this.renderer.setPixelRatio(window.devicePixelRatio) // 将渲染器添加到页面 this.$refs.container.appendChild(this.renderer.domElement) this.animate() // 加载fbx模型 const loader = new FBXLoader() loader.load('/path/to/model.fbx', (fbx) => { this.scene.add(fbx) }) }, methods: { animate() { requestAnimationFrame(this.animate) this.renderer.render(this.scene, this.camera) } } } </script> ``` 在mounted函数,我们创建了场景、相机和渲染器,并将渲染器添加到Vue组件的DOM元素。然后,使用FBXLoader加载fbx模型,并将模型添加到场景。最后,使用requestAnimationFrame函数来循环渲染场景。 3. 在Vue3使用ThreeScene组件 在Vue3项目,我们可以使用ThreeScene组件来加载fbx模型。例如: ```html <template> <div> <ThreeScene /> </div> </template> <script> import ThreeScene from './ThreeScene.vue' export default { components: { ThreeScene } } </script> ``` 这样就可以在Vue3加载fbx模型了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值