three js模型旋转

news2024/11/24 19:57:02

如何让立方体模型旋转到指定的面
父页面

 <b-modal ref="modal_mini" size="lg" centered 
              static 
              :hide-footer="true"
              :dialog-class="['modal_mini']"
              :content-class="'position-static'"
              :body-class="'p-0'"
              :header-class="['modal_headers','justify-content-between','align-items-center']" >
      <template v-slot:modal-header="{close}" style=" color: #FFF; background-color: #343a40;">
        <h6 class="m-0 text-truncate">{{ Module.name }}</h6>
        <div class="btn-group">
          <button class="btn mr-2" @click="maximize($refs['threeD'+Module.id])">
            <font-awesome-icon :icon="['far', 'window-maximize']"/>
          </button>
          <button class="btn" @click="close()">
            <font-awesome-icon icon="times-circle"/>
          </button>
        </div>
      </template>
      <div class="modal_body">
        <div class="row col-auto justify-content-between align-items-center"
              style="padding: 5px 20px">
          <div class="btn-group col-auto">
            <b-button variant="primary" class="btn" size="sm"
                      @click="showModalSave(Module.id, Module.rawPath)">
              <font-awesome-icon icon="cogs"/>
              {{ $t('设置') }}
            </b-button>
            <b-button variant="primary" class="btn" size="sm"
                      @click="capture($refs['threeD'+Module.id])">
              <font-awesome-icon icon="save"/>
              {{ $t('保存截图') }}
            </b-button>
          </div>
          <b-input-group :key="Module.id" size="sm" class="col flex-shrink-1 ml-4">
            <b-input-group-prepend>
              <b-input-group-text class="px-3">x</b-input-group-text>
            </b-input-group-prepend>

            <b-form-input style="height: 38px" v-model="Module.x" :formatter="format_positiveNumber" type="number"
                          min="0.00"></b-form-input>
            <b-input-group-prepend>
              <b-input-group-text class="px-3">y</b-input-group-text>
            </b-input-group-prepend>
            <b-form-input style="height: 38px" v-model="Module.y" :formatter="format_positiveNumber" type="number"
                          min="0.00"></b-form-input>
            <b-input-group-prepend>
              <b-input-group-text class="px-3">z</b-input-group-text>
            </b-input-group-prepend>
            <b-form-input style="height: 38px" v-model="Module.z" :formatter="format_positiveNumber" type="number"
                          min="0.00"></b-form-input>

            <b-input-group-append>
              <b-input-group-text class="px-3 cursor-pointer"
                                  @click="XYZ($refs['threeD'+Module.id],0,Module)">{{ $t('确定') }}
              </b-input-group-text>
              <b-input-group-text class="px-3 cursor-pointer"
                                  @click="reset($refs['threeD'+Module.id],Module)">{{ $t('还原') }}
              </b-input-group-text>
            </b-input-group-append>
          </b-input-group>
        </div>
        <div class="row col-auto justify-content-between align-items-center"
              style="padding: 5px 20px">
          <b-input-group-prepend>
            <img :src="modelPath" alt="" class="modelePathImg">
            <el-select v-model="value" placeholder="" @change="takeAxialDirectionType($event,Module)" style="width: 156px;">
              <el-option
              v-for="item in modelImgList"
              :key="item.value"
              :label="item.label"
              :value="item.value">
                <div class="modeleBox">
                  <img :src="item.img" alt="" class="modelImg">
                </div> 
              </el-option>

            </el-select>
            
            <!-- <b-form-select v-model="axialDirection" @change="takeAxialDirectionType($event,Module)" style="width: 156px;">
              <option value="top" style="width:10px;height: 10px;">
                <div style="width:10px;height: 20px;">
                  <img src="../assets/3D/顶部视角.png" alt="" style="display: block;width:10px;height: 10px;">
                </div>
              </option>
              <option value="left">{{ $t('固定Y轴') }}</option>
              <option value="right">{{ $t('固定Z轴') }}</option>
              <option value="bottom">{{ $t('固定Z轴') }}</option>
              <option value="ago">{{ $t('固定Z轴') }}</option>
              <option value="after">{{ $t('固定Z轴') }}</option>
            </b-form-select> -->
          </b-input-group-prepend>
          <b-input-group :key="Module.id" size="sm" class="col flex-shrink-1 ml-4">

            <b-input-group-prepend>
              <b-input-group-text class="px-3">x</b-input-group-text>
            </b-input-group-prepend>

            <b-form-input style="height: 38px" v-model="Module.scaleX" :formatter="bigZeroNumAndFloat" type="number"
                          min="0"></b-form-input>
            <b-input-group-prepend>
              <b-input-group-text class="px-3">y</b-input-group-text>
            </b-input-group-prepend>
            <b-form-input style="height: 38px" v-model="Module.scaleY" :formatter="bigZeroNumAndFloat" type="number"
                          min="0.00"></b-form-input>
            <b-input-group-prepend>
              <b-input-group-text class="px-3">z</b-input-group-text>
            </b-input-group-prepend>
            <b-form-input style="height: 38px" v-model="Module.scaleZ" :formatter="bigZeroNumAndFloat" type="number"
                          min="0.00"></b-form-input>

            <b-input-group-append>
              <b-input-group-text class="px-5 cursor-pointer"
                                  @click="takeScaleType('big',Module)">确定
              </b-input-group-text>
              <!-- <b-input-group-text class="px-3 cursor-pointer"
                                  @click="takeScaleType('big',Module)">{{ $t('放大') }}
              </b-input-group-text>
              <b-input-group-text class="px-3 cursor-pointer"
                                  @click="takeScaleType('small',Module)">{{ $t('缩小') }}
              </b-input-group-text> -->
            </b-input-group-append>
          </b-input-group>
        </div>
        <div class="row cards" style="padding: 5px 20px">
          <three-d
              v-if="Module.isShow"
              :ref="'threeD'+Module.id"
              :xyz="Module.xyz"
              :imgs="Module.imgs"
              :key="Module.id"
              :axialDirection="axialDirection"
              :scaleType="scaleType"
              :scaleXYZ="[Module.scaleX,Module.scaleY,Module.scaleZ]"
              :aspect_w="794"
              :aspect_h="450"></three-d>
        </div>
        <!-- <div class="select_color" @click="getRatio"  :style="{'background':colorBar}">
          <el-color-picker v-model="selectColor" show-alpha :predefine="predefineColors"
                @change="setColor($event,0,Module.id,$refs['threeD'+Module.id],Module)"></el-color-picker>
        </div> -->
      </div>
    </b-modal>

效果:在这里插入图片描述

<template>
  <div :class="{fullModal:fullScreen}">
    <font-awesome-icon v-show="fullScreen" icon="times-circle" class="fullModal_close" @click="mini()"/>
    <div ref="container" id="container"></div>
  </div>
</template>

<script>
import {
  BoxGeometry,
  BufferAttribute,
  Color,
  DirectionalLight,
  DoubleSide,
  EdgesGeometry,
  Fog,
  Group,
  LineBasicMaterial,
  LineSegments,
  Mesh,
  MeshBasicMaterial,
  PerspectiveCamera,
  PlaneBufferGeometry,
  Scene,
  TextureLoader,
  WebGLRenderer
} from "three";
import {OrbitControls} from "three/examples/jsm/controls/OrbitControls";
import Stats from "three/examples/jsm/libs/stats.module.js";
import dat from "three/examples/jsm/libs/dat.gui.module.js";

export default {
  name: "ThreeD",
  data() {
    return {
      rotation:'',
      rotationType:null,
      scene: null,
      box: { 
        scale:{
        x:null,
        y:null,
        z:null
      }
      }, // 立方体Group
      plane:{
        scale:{
          x:null,
          y:null,
          z:null
        }
      }, // 三个平面Group
      plane_x: null, // x方向的面
      plane_y: null, // y方向的面
      plane_z: null, // z方向的面
      camera: null,
      container: null,
      renderer: null,
      stats: null,
      // aspect_w: 600, // 宽高比_宽
      // aspect_h: 450, // 宽高比_高
      fullScreen: false,
      // aspect_w: window.innerWidth, // 宽高比_宽
      // aspect_h: window.innerHeight, // 宽高比_高
      boxCopy: null
    };
  },
  props: {
    static: {
      type: Boolean,
      default: () => false,
    },
    xyz: {
      type: Array,
      default: () => [100, 100, 100],
    },
    imgs: {
      type: Array,
      // default: () => [
      // 	require('@/assets/3d_demo/right.jpg'),
      // 	require('@/assets/3d_demo/left.jpg'),
      // 	require('@/assets/3d_demo/top.jpg'),
      // 	require('@/assets/3d_demo/bottom.jpg'),
      // 	require('@/assets/3d_demo/front.jpg'),
      // 	require('@/assets/3d_demo/back.jpg'),
      // ]
    },
    axialDirection: {
      type: String,
      default: ''
    },
    scaleType: {
      type: String,
      default: ''
    },
    aspect_w: {
      type: Number,
      default: 600
    },
    aspect_h: {
      type: Number,
      default: 450
    },
    scaleXYZ: {
      type: Array,
      default: () => {
        return [1, 1, 1]
      }
    },
  },
  methods: {
    takeScale() {
          this.box.scale.x = this.scaleXYZ[0];
          this.plane.scale.x = this.scaleXYZ[0];
          this.box.scale.y = this.scaleXYZ[1];
          this.plane.scale.y = this.scaleXYZ[1];
          this.box.scale.z = this.scaleXYZ[2];
          this.plane.scale.z = this.scaleXYZ[2];
      // if (this.scaleType === 'big') {
      //   if (this.axialDirection === 'X') {
      //     console.log(this.scaleXYZ[0])
      //     this.box.scale.x += this.scaleXYZ[0];
      //     console.log(this.scaleXYZ[0])
      //     this.plane.scale.x += this.scaleXYZ[0];
      //   } else if (this.axialDirection === 'Y') {
      //     this.box.scale.y += this.scaleXYZ[1];
      //     this.plane.scale.y += this.scaleXYZ[1];
      //   } else if (this.axialDirection === 'Z') {
      //     this.box.scale.z += this.scaleXYZ[2];
      //     this.plane.scale.z += this.scaleXYZ[2];
      //   }else if(this.axialDirection === ''){
      //     console.log(this.scaleXYZ)
      //     this.box.scale.x += this.scaleXYZ[0];
      //     this.plane.scale.x += this.scaleXYZ[0];
      //     this.box.scale.y += this.scaleXYZ[1];
      //     this.plane.scale.y += this.scaleXYZ[1];
      //     this.box.scale.z += this.scaleXYZ[2];
      //     this.plane.scale.z += this.scaleXYZ[2];
      //   }
      // } else if (this.scaleType === 'small') {
      //   if (this.axialDirection === 'X') {
      //     this.box.scale.x -= this.scaleXYZ[0];
      //     this.plane.scale.x -= this.scaleXYZ[0];
      //   } else if (this.axialDirection === 'Y') {
      //     this.box.scale.y -= this.scaleXYZ[1];
      //     this.plane.scale.y -= this.scaleXYZ[1];
      //   } else if (this.axialDirection === 'Z') {
      //     this.box.scale.z -= this.scaleXYZ[2];
      //     this.plane.scale.z -= this.scaleXYZ[2];
      //   }else if(this.axialDirection === ''){
      //     this.box.scale.x -= this.scaleXYZ[0];
      //     this.plane.scale.x -= this.scaleXYZ[0];
      //     this.box.scale.y -= this.scaleXYZ[1];
      //     this.plane.scale.y -= this.scaleXYZ[1];
      //     this.box.scale.z -= this.scaleXYZ[2];
      //     this.plane.scale.z -= this.scaleXYZ[2];
      //   }
      // } else {
      //   this.box.scale.x = 1
      //   this.plane.scale.x = 1
      //   this.box.scale.y = 1
      //   this.plane.scale.y = 1
      //   this.box.scale.z = 1
      //   this.plane.scale.z = 1
      // }
    },
    **// 模型旋转
    **modelRotation(type){
      if(this.rotationType == 'x'){
        if(this.rotation == 'Math.PI/2'){
          this.box.rotateX(Math.PI/-2);//上面
        }else if(this.rotation == 'Math.PI/-2'){
          this.box.rotateX(Math.PI/2)
        }
      }else if(this.rotationType == 'y'){
        if(this.rotation == 'Math.PI/2'){
          this.box.rotateY(Math.PI/-2)
        }else if(this.rotation == 'Math.PI/-2'){
          this.box.rotateY(Math.PI/2)
        }else if(this.rotation == 'Math.PI/180'){
          this.box.rotateY(Math.PI/-180)
        }else if(this.rotation == 'Math.PI/1'){
          this.box.rotateY(Math.PI/1)
        }
      }
      if(type ==1){
        this.box.rotateX(Math.PI/2);//上面
        this.rotation = 'Math.PI/2'
        this.rotationType = 'x'
      }else if(type==2){
        this.box.rotateX(Math.PI/-2);//下面
        this.rotation = 'Math.PI/-2'
        this.rotationType = 'x'
      }else if(type==3){
        this.box.rotateY(Math.PI/2);//左面
        this.rotation = 'Math.PI/2'
        this.rotationType = 'y'
      }else if(type==4){
        this.box.rotateY(Math.PI/-2);//右面
        this.rotation = 'Math.PI/-2'
        this.rotationType = 'y'
      }else if(type ==5){
        this.box.rotateY(Math.PI/180);//前面
        this.rotation = 'Math.PI/180'
        this.rotationType = 'y'
      }else if(type ==6){
        this.box.rotateY(Math.PI/1);//前面
        this.rotation = 'Math.PI/1'
        this.rotationType = 'y'
      }
    },****
    initGui() { // 调试插件
      new dat.GUI();
    },
    initScene() { // 场景
      this.scene = new Scene();
      this.scene.background = new Color(0x3c3838);
      this.scene.fog = new Fog(0x050505, 2000, 3500);
    },
    initCamera() { // 相机
      this.camera = new PerspectiveCamera(35, this.aspect_w / this.aspect_h, 0.1, 50000);
      const max = Math.max(...this.xyz) + 20;
        let num = 1000/max  
        this.camera.position.z = max+100;
        this.camera.position.x = max-4000*num;
        this.camera.position.y = max-300;
      console.log(max)
      

    },
    initLight() { // 灯光
      const light = new DirectionalLight(0xffffff, 5.0); 
      light.position.set(500, 500, 3500);
      this.scene.add(light);
      const light1 = new DirectionalLight(0xffffff, 1); 
      light.position.set(1400, -3500, 1400);
      this.scene.add(light1);
      const light2 = new DirectionalLight(0xffffff, 1); 
      light.position.set(-1400, -3500, 1400);
      this.scene.add(light2);
      const light3 = new DirectionalLight(0xffffff, 1); 
      light.position.set(-3500, -3500, -3500);
      this.scene.add(light3);
    },
    initRenderer() { // 渲染器
      this.renderer = new WebGLRenderer();
      this.renderer.setPixelRatio(window.devicePixelRatio);
      const h = this.container.clientWidth / this.camera.aspect;
      const w = this.container.clientWidth;
      if (w === 0) {
        this.renderer.setSize(this.aspect_w, this.aspect_h);
      } else {
        this.renderer.setSize(w, h);
      }
      this.container.appendChild(this.renderer.domElement);
    },
    initStats() { // 性能插件
      this.stats = new Stats();
      this.container.appendChild(this.stats.dom);
    },
    initControls() { // 控制器
      this.controls = new OrbitControls(this.camera, this.container);
    },
    initContent() {
      if (!this.imgs || this.imgs.length < 1) return;
      const box = new BoxGeometry(this.xyz[0], this.xyz[1], this.xyz[2]); // XYZ
      // 加载六个面的纹理贴图
      const textureLoader = new TextureLoader();
      // textureLoader.setCrossOrigin('');
      // 材质数组
      const materialArr = this.imgs.map(img => new MeshBasicMaterial({map: textureLoader.load(img)}));
      const mesh = new Mesh(box, materialArr);
      this.mesh = mesh
 
      // mesh.scale.set(2, 1.5, 2); 模型缩放
      // 边缘棱线
      const edges = new EdgesGeometry(box, 1);
      const line = new LineSegments(edges, new LineBasicMaterial({color: 0xffffff}));
      this.box = new Group();
      this.box.add(mesh);
      this.box.add(line);
      this.boxCopy = JSON.parse(JSON.stringify(this.box))
      this.scene.add(this.box);
    },
    update() {
      // this.stats.update();
      this.controls.update();
    },
    animate() {
      requestAnimationFrame(this.animate);
      this.renderer.render(this.scene, this.camera);
      this.update();
    },

    init() {
      if (this.fullScreen) {
        this.aspect_w = window.innerWidth; // 宽高比_宽
        this.aspect_h = window.innerHeight; // 宽高比_高
      }
      this.container = this.$refs.container;
      this.initScene();
      this.initCamera();
      this.initRenderer();
      this.initLight();
      // this.initGui();
      // this.initStats();
      this.initContent();
      this.initControls();

      // 窗口变动触发的方法
      const onWindowResize = () => {
        // 重新设置相机的宽高比
        this.camera.aspect = this.aspect_w / this.aspect_h;
        // 更新相机投影矩阵
        this.camera.updateProjectionMatrix();
        // 更新渲染器大小
        const h = this.container.clientWidth / this.camera.aspect;
        const w = this.container.clientWidth;
        this.renderer.setSize(w, h);
      };
      window.addEventListener('resize', onWindowResize, false);
    },
    capture() { // 截图
      this.renderer.render(this.scene, this.camera); // 先渲染一帧,防止截图内容为空
      const src = this.renderer.domElement.toDataURL("image/jpeg"); //转化为base64
      this.$emit('capture', src);
      return src;
    },
    // initThreePlanes({x = 0, y = 0, z = 0} = {}, {xImgUrl, yImgUrl, zImgUrl}) {
    initThreePlanes(obj, {xImgUrl, yImgUrl, zImgUrl}) {
      // 注意:后端的z对应前端的y,后端的x对应前端的z,后端的y对应前端的x
      // let y = obj.y;
      // let z = obj.z;
      // let x = obj.x;

      // let y = obj.z;
      // let z = obj.x;
      // let x = obj.y;

      let x = obj.x;
      let y = obj.y;
      let z = obj.z;

      x -= 1;
      y -= 1;
      z -= 1;
      const textureLoader = new TextureLoader();
      // const [z_length, x_length, y_length] = this.xyz;
      const [x_length, y_length, z_length] = this.xyz;
      // y = y_length - y; // 后端的这个方向相反
      // z = y_length - z; // 后端的这个方向相反

      if (this.plane) {
        this.scene.remove(this.plane);
      }
      this.plane = new Group();

      if (zImgUrl) {
        // z方向的面
        const geometry_z = new PlaneBufferGeometry();
        const vertices_z = new Float32Array([
          0, y_length, z, // 左上
          x_length, y_length, z, // 右上
          0, 0, z, // 左下
          x_length, 0, z // 右下
          // 0, y_length, 360, // 左上
          // x_length, y_length, 360, // 右上
          // 0, 0, 360, // 左下
          // x_length, 0, 360 // 右下
        ]);
        geometry_z.addAttribute("position", new BufferAttribute(vertices_z, 3));
        const material_z = new MeshBasicMaterial({side: DoubleSide, map: textureLoader.load(zImgUrl)});
        this.plane_z = new Mesh(geometry_z, material_z);
        this.plane.add(this.plane_z);
      }

      if (yImgUrl) {
        const geometry_y = new PlaneBufferGeometry();
        const vertices_y = new Float32Array([
          0, y, 0, // 左上
          x_length, y, 0, // 右上
          0, y, z_length, // 左下
          x_length, y, z_length, // 右下
        ]);
        geometry_y.addAttribute("position", new BufferAttribute(vertices_y, 3));
        const material_y = new MeshBasicMaterial({side: DoubleSide, map: textureLoader.load(yImgUrl)});
        this.plane_y = new Mesh(geometry_y, material_y);
        this.plane.add(this.plane_y);
      }

      if (xImgUrl) {
        const geometry_x = new PlaneBufferGeometry();
        const vertices_x = new Float32Array([
          x, y_length, 0, // 左上
          x, y_length, z_length, // 右上
          x, 0, 0, // 左下
          x, 0, z_length // 右下
        ]);
        geometry_x.addAttribute("position", new BufferAttribute(vertices_x, 3));
        const material_x = new MeshBasicMaterial({side: DoubleSide, map: textureLoader.load(xImgUrl)});
        this.plane_x = new Mesh(geometry_x, material_x);
        this.plane.add(this.plane_x);
      }
      // 将模型中心移到坐标系原点
      this.plane.translateX(-x_length / 2);
      this.plane.translateY(-y_length / 2);
      this.plane.translateZ(-z_length / 2);
      this.scene.add(this.plane);
    },
    showThreePlane(xyz, imgs) {
      this.initThreePlanes(xyz, imgs);
      this.plane.visible = true;
      this.box.visible = false;
      const max = Math.max(...this.xyz) + 250;
      this.camera.position.z = max;
      this.camera.position.x = max;
      this.camera.position.y = max;
    },
    showBox() {
      this.box.visible = true;
      this.plane.visible = false;
      const max = Math.max(...this.xyz) + 50;
      this.camera.position.z = max;
      this.camera.position.x = max;
      this.camera.position.y = max;
    },
    maximize() {
      this.aspect_w = window.innerWidth; // 宽高比_宽
      this.aspect_h = window.innerHeight; // 宽高比_高
      this.camera.aspect = this.aspect_w / this.aspect_h;
      this.camera.updateProjectionMatrix();
      this.renderer.setSize(this.aspect_w, this.aspect_h);
      this.fullScreen = true;
    },
    mini() {
      this.aspect_w = this.aspect_w || 600; // 宽高比_宽
      this.aspect_h = this.aspect_h || 450; // 宽高比_高
      this.camera.aspect = this.aspect_w / this.aspect_h;
      this.camera.updateProjectionMatrix();
      this.renderer.setSize(this.aspect_w, this.aspect_h);
      this.fullScreen = false;
    },
  },
  mounted() {
    this.init();
    this.animate();
  }
};
</script>

<style scoped lang="scss">
#container {
  height: 100%;
  width: 100%;
}

::v-deep canvas {
  width: 100% !important;
  height: 100% !important;
}

.fullModal {
  position: fixed;
  top: 0;
  left: 0;
  z-index: 2042;
  width: 100vw;
  height: 100vh;
  background-color: #000;

  &_close {
    position: fixed;
    cursor: pointer;
    top: 5px;
    right: 5px;
    height: 25px;
    width: 25px;
    z-index: 2043;
    color: #FFF;
  }
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/745533.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

上海亚商投顾:沪指放量调整 两市超4000只个股下跌

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 沪指今日震荡调整&#xff0c;深成指、创业板指午后跌超1%。AI概念股集体下挫&#xff0c;CPO、算力等方向领跌&am…

感知网络安全态势是什么?感知网络安全态势如何实施

网络安全是当今社会中一个非常重要的话题。随着互联网的普及和信息技术的发展&#xff0c;网络安全问题日益突出。为了有效应对各种网络威胁和攻击&#xff0c;网络安全态势感知成为了一种关键的技术手段。 网络安全态势感知的定义 网络安全态势感知是指通过对网络环境中的各种…

2023-07-11力扣每日一题

链接&#xff1a; https://leetcode.cn/problems/maximum-alternating-subsequence-sum/ 题意&#xff1a; 给定一个数组&#xff0c;求一个子序列&#xff0c;使这个子序列的奇数位和-偶数位和最大&#xff08;下标从1开始的话|反正第一个数是&#xff09; 解&#xff1a;…

基于linux下的高并发服务器开发(第一章)-Linux环境开发搭建1.1

1、安装虚拟机 2、在虚拟机中安装Linux系统 &#xff08;1&#xff09;新建虚拟机向导 点击虚拟机设置&#xff0c;使用ISO映像文件(M) &#xff08;2&#xff09;Ubuntu18安装 点击现在安装 点击继续 静静地接下来的安装即可 安装好后&#xff0c;安装VMware Tools 将压缩…

设计原则及设计模式基础

设计模式是一套被反复使用的、多数人知晓的、经过分类编目的代码设计经验的总结&#xff0c;使用设计模式是为了可以重用代码&#xff0c;让代码更容易被他人理解并且提高代码的可靠性。 1 设计模式概述 GoF(Gang Of Four 四人组&#xff0c;指4位著名软件工程学者)&#xff…

ubuntu安装单个redis服务

1.apt-get install redis-server 使用lighthouse用户这样操作会报与权限有关的错误&#xff0c; 改成使用root账号操作 2.安装完成后&#xff0c;Redis服务器会自动启动&#xff0c;查看进程是否正常启动 ps -axu|grep redis redis 18689 0.1 0.4 40136 6860 ? …

第3讲 Camera Sensor 数据流

Camera Sensor Block Camera Sensor Output Format raw8 一个像素点用8bit来表示&#xff0c;范围0&#xff5e;256 raw10 一个像素点用10bit来表示&#xff0c;范围0&#xff5e;1024 raw12 一个像素点用12bit来表示&#xff0c;范围0&#xff5e;4096 Camera Sensor Fr…

智慧园区:如何利用AI识别与视频技术实现工业园区监管模式的升级?

一、背景分析 智慧园区建设的目标是通过运用现代信息技术&#xff0c;通过智能化管理&#xff0c;解决园区管理中存在的许多难题&#xff0c;例如信息不对称、资源浪费等问题&#xff0c;将园区内的设施、设备和系统进行连接和互通&#xff0c;园区可以实现各种资源的高效利用…

这一次,Python 真的有望告别 GIL 锁了?

Python 中有一把著名的锁——全局解释器锁&#xff08;Global Interpreter Lock&#xff0c;简写 GIL&#xff09;&#xff0c;它的作用是防止多个本地线程同时执行 Python 字节码&#xff0c;这会导致 Python 无法实现真正的多线程执行。&#xff08;注&#xff1a;本文中 Pyt…

TexSpire-比markdown更为简洁的文本标记语言,用文字即可生成演示效果

文章目录 一、前言二、语言特点三、举例1、文本框2、表格3、折线图4、思维导图 四、相关资料 一、前言 老实说&#xff0c;本人对于ppt的花里胡哨深恶痛绝&#xff0c;特别是每一次汇报&#xff0c;都需要花费我很多时间去找模板&#xff0c;去设计&#xff0c;去美化内容时&a…

【源码分析系列】number-precision和bignumber.js

01_JS精度 好久前在公司分享的文章&#xff0c;现在才发…本文阐述了为什么0.1 0.2 ! 0.3&#xff0c;并分析了number-precision和bignumber.js的解决原理 被JS精度问题小坑了一把&#xff0c;所以系统来 复习 学习一波~ 背景 在实际业务开发中&#xff0c;可能会遇到一下问题…

Redis_简介(1)

目录 Redis简介 Redis特性 Redis 优势 Redis应用场景 源码等资料获取方法 Redis简介 Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。从2010年3月15日起&#xff0c;Redis的开发工作由…

Git命令-状态与版本查看

Git是一个强大的分布式管理系统,版本控制主要在本地端完成,在团队合作和协助开发中,都在广泛使用Git工具,因为他免费哈哈哈 目录 git status git reflog git reset --hard 版本号 git status 可以查看当前git状态 On branch master 是你当前的分支状态,当前我是在master主…

[分布式] zookeeper集群与kafka集群

目录 一、Zookeeper 概述1.1 Zookeeper定义1.2 Zookeeper 工作机制1.3 Zookeeper 特点1.4 Zookeeper 数据结构1.5 Zookeeper 应用场景1.6 Zookeeper 选举机制 二、 部署 Zookeeper 集群2.1 环境部署2.2 关闭防火墙2.3 安装 JDK 下载安装包 安装 Zookeeper2.4 修改配置文件2.5 将…

[NGINX] NGINX下载、安装编译、启动检查停止命令

一、NGINX 下载 mkdir -p /soft/nginx cd /soft/nginx wget https://nginx.org/download/nginx-1.21.6.tar.gz二、下载相关依赖 ①在线安装依赖&#xff1a; yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel ②下载依赖到本地安装依赖&#xff1a; y…

2023年7月23日 星期三 Linux驱动作业

1.使用驱动代码实现如下要求 a.应用程序通过阻塞的io模型来读取number变量的值 b.number是内核驱动中的一个变量 c.number的值随着按键按下而改变(按键中断) 例如number0 按下按键number1再次按下按键number0 d.在按下按键的时候需要同时将1ed1的状态取反 e.驱动中需要编写字符…

FlinkCDC第四部分-同步mysql到mysql,ctrl就完事~(flink版本1.17.1)

本文介绍了不同源单表-单表同步&#xff0c;不同源多表-单表同步。 注&#xff1a;此版本支持火焰图 Flink版本&#xff1a;1.17.1 环境&#xff1a;Linux CentOS 7.0、jdk1.8 基础文件&#xff1a; flink-1.17.1-bin-scala_2.12.tgz、 flink-connector-jdbc-3.0.0-1.16.…

LeetCode·每日一题·2544. 交替数字和·模拟

作者&#xff1a;小迅 链接&#xff1a;https://leetcode.cn/problems/alternating-digit-sum/solutions/2341276/mo-ni-zhu-shi-chao-ji-xiang-xi-by-xun-ge-7fjq/ 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 著作权归作者所有。商业转载请联系作者获得授权&#…

产品经理学习画原型(三)

1.布尔运算的使用 合并必须选择两个及以上元件 合并后&#xff1a; 组合&#xff1a; 去除顶层&#xff1a;

【基于FPGA的芯片设计】32位RISC-V存储器

实验板卡&#xff1a;xc7a100tlc sg324-2L&#xff0c;共20个开关 实验要求