WebGL-Vue3-TS-Threejs:基础练习 / Javascript 3D library / demo

news2024/11/22 16:13:36

一、理解Three.js

Three.js是一个用于WebGL渲染的JavaScript库。它提供了一组工具和类,用于创建和渲染3D图形和动画。简单理解(并不十分准确),Three.js之于WebGL,好比,jQuery.js之于JavaScript。

OpenGL 是一个跨平台3D/2D的绘图标准,WebGL则是OpenGL 在浏览器上的一个实现。
web前端开发人员可以直接用WebGL接口进行编程,但 WebGL只是非常基础的绘图API,需要编程人员有很多的数学知识、绘图知识才能完成3D编程任务,而且代码量巨大。Threejs 对 WebGL 进行了封装,让前端开发人员在不需要掌握很多数学知识和绘图知识的情况下,也能够轻松进行web 3D开发,降低了门槛,同时大大提升了效率。

WebGL:开始学习 / 理解 WebGL / WebGL 需要掌握哪些知识 / 应用领域 / 前端值得学WebGL吗_webgl培训-CSDN博客

Three.js的主要特点

序号特点描述
1简单易用它的API非常友好,易于理解和使用。
2兼容性强支持多种浏览器和设备,不需要其他插件和软件。
3功能强大提供了广泛的3D渲染功能,包括材质、灯光、相机等多种元素。
4社区活跃拥有庞大的开发者社区,可以找到大量的示例代码和教程。

通过Three.js,开发者可以快速创建并展示3D模型、场景、动画等内容。它支持多种文件格式,如obj、fbx、glb等,可以轻松导入和使用。同时,它还支持VR和AR等技术,可以创建更加沉浸式的体验。

关键词:场景、相机、光源、材质、贴图、建模、着色

二、文档

ThingJS 文档中心

https://threejs.org/

Three.js中文网

三、项目介绍

vue3 + ts + vite + three.js

四、安装


pnpm add three
pnpm add @types/three

"three": "^0.158.0", 

"@types/three": "^0.154.0", 

五、导入核心库,获取场景

<template>
    <div class="container">
      <span>threejs</span>
    </div>
</template>
  
<script setup lang="ts">
import * as THREE from 'three'
const scene = new THREE.Scene()
console.log('scene:', scene)
  
</script>
  
<style scoped lang="less">
</style>

六、基础练习

6.1、绘制一条直线

<template>
    <div ref="container" id="container" style="width: 200px;height: 200px;"></div>
</template>
  
<script setup lang="ts">
import * as THREE from 'three'
const container:any = ref(null)
onMounted(()=>{
  // 创建场景
  const scene = new THREE.Scene();
  scene.background = new THREE.Color(0xadacad);

  // 创建相机
  const camera = new THREE.PerspectiveCamera(
    45,
    container.value.clientWidth / container.value.clientHeight,
    0.1,
    100
  );
  camera.position.set(0, 0, 3);

  // 创建渲染器
  const renderer = new THREE.WebGLRenderer();
  console.log('24', container)
  renderer.setSize(container.value.clientWidth, container.value.clientHeight);
  container.value.appendChild(renderer.domElement);

  // 定义顶点数据
  const positions = [
    -1, 0, 0,
    0, 1, 0,
  ];

  // 创建一个 BufferGeometry 对象
  const geometry = new THREE.BufferGeometry();
  const positionAttribute = new THREE.Float32BufferAttribute(positions, 3);
  geometry.setAttribute('position', positionAttribute);

  // 创建一个 LineLoop 对象
  const material = new THREE.LineBasicMaterial({ color: 0xf00, linewidth: 5 });
  const line = new THREE.LineLoop(geometry, material);

  // 将线条添加到场景中
  scene.add(line);

  // 开始渲染循环
  function render() {
    renderer.render(scene, camera);
    requestAnimationFrame(render);
  }
  render();
})
</script>
  
<style scoped lang="less">
</style>

6.2、通过直线,绘制画一个正方形

本例中,我们首先创建了一个 div 元素引用,它将用作 three.js 的渲染器容器。然后创建了场景、相机和渲染器,并将渲染器的输出添加到页面中。

接着,我们定义了闭合线条的顶点数据,并使用 THREE.BufferGeometry 创建了几何体。然后我们使用 THREE.LineLoop 创建了线条对象,并将其添加到场景中。

<template>
    <div ref="container" id="container" style="width: 200px;height: 200px;"></div>
</template>
  
<script setup lang="ts">
import * as THREE from 'three'
const container:any = ref(null)
onMounted(()=>{
  // 创建场景
  const scene = new THREE.Scene();
  scene.background = new THREE.Color(0xadacad);

  // 创建相机
  const camera = new THREE.PerspectiveCamera(
    45,
    container.value.clientWidth / container.value.clientHeight,
    0.1,
    100
  );
  camera.position.set(0, 0, 3);

  // 创建渲染器
  const renderer = new THREE.WebGLRenderer();
  console.log('24', container)
  renderer.setSize(container.value.clientWidth, container.value.clientHeight);
  container.value.appendChild(renderer.domElement);

  // 定义顶点数据
  const positions = [
    -1, 0, 0,
    0, 1, 0,
    1, 0, 0,
    0, -1, 0,
    -1, 0, 0,
  ];

  // 创建一个 BufferGeometry 对象
  const geometry = new THREE.BufferGeometry();
  const positionAttribute = new THREE.Float32BufferAttribute(positions, 3);
  geometry.setAttribute('position', positionAttribute);

  // 创建一个 LineLoop 对象
  const material = new THREE.LineBasicMaterial({ color: 0xf00, linewidth: 5 });
  const line = new THREE.LineLoop(geometry, material);

  // 将线条添加到场景中
  scene.add(line);

  // 开始渲染循环
  function render() {
    renderer.render(scene, camera);
    requestAnimationFrame(render);
  }
  render();
})
</script>
  
<style scoped lang="less">
</style>

6.3、 vue3 typescript项目 在script使用setup语法糖的方式下,使用最新 threejs api 创建文字

待补充

使用THREE.TextGeometry创建文字的模型,并使用THREE.MeshBasicMaterialTHREE.Mesh将其渲染到场景中

6.4、绘制一个圆形

本例中,首先创建了一个Three.js场景、相机和渲染器。然后创建了一个圆形几何体和一个材质,并使用它们创建了一个网格。最后将圆形添加到场景中,并创建一个animate函数用于实现动画效果。

<template>
  <div id="app"></div>
</template>

<script lang="ts">
import { defineComponent } from 'vue';
import * as THREE from 'three';

export default defineComponent({
  name: 'HelloWorld',
  setup() {
    const scene = new THREE.Scene();

    const camera = new THREE.PerspectiveCamera(
      75,
      window.innerWidth / window.innerHeight,
      0.1,
      1000
    );

    const renderer = new THREE.WebGLRenderer();
    renderer.setSize(window.innerWidth, window.innerHeight);
    document.getElementById('app')?.appendChild(renderer.domElement);

    const geometry = new THREE.CircleGeometry(50, 32);
    const material = new THREE.MeshBasicMaterial({
      color: 0xff0000,
      wireframe: true,
    });

    const circle = new THREE.Mesh(geometry, material);
    scene.add(circle);

    camera.position.z = 100;

    const animate = function () {
      requestAnimationFrame(animate);

      circle.rotation.x += 0.01;
      circle.rotation.y += 0.01;

      renderer.render(scene, camera);
    };

    animate();

    return { scene, camera, renderer };
  },
});
</script>

6.5、绘制一个圆锥

<template>
  <div id="app"></div>
</template>

<script lang="ts">
import { defineComponent } from 'vue';
import * as THREE from 'three';

export default defineComponent({
  name: 'HelloWorld',
  setup() {
    const scene = new THREE.Scene();

    const camera = new THREE.PerspectiveCamera(
      75,
      window.innerWidth / window.innerHeight,
      0.1,
      1000
    );

    const renderer = new THREE.WebGLRenderer();
    renderer.setSize(window.innerWidth, window.innerHeight);
    document.getElementById('app')?.appendChild(renderer.domElement);

    const geometry = new THREE.ConeGeometry(50, 100, 32);
    const material = new THREE.MeshBasicMaterial({
      color: 0xff0000,
      wireframe: true,
    });

    const cone = new THREE.Mesh(geometry, material);
    scene.add(cone);

    camera.position.z = 100;

    const animate = function () {
      requestAnimationFrame(animate);

      cone.rotation.x += 0.01;
      cone.rotation.y += 0.01;

      renderer.render(scene, camera);
    };

    animate();

    return { scene, camera, renderer };
  },
});
</script>

6.6、绘制一个立方体

<template>
  <div id="app"></div>
</template>

<script lang="ts">
import { defineComponent } from 'vue';
import * as THREE from 'three';

export default defineComponent({
  name: 'HelloWorld',
  setup() {
    const scene = new THREE.Scene();

    const camera = new THREE.PerspectiveCamera(
      75,
      window.innerWidth / window.innerHeight,
      0.1,
      1000
    );

    const renderer = new THREE.WebGLRenderer();
    renderer.setSize(window.innerWidth, window.innerHeight);
    document.getElementById('app')?.appendChild(renderer.domElement);

    const geometry = new THREE.BoxGeometry(1, 1, 1);
    const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
    const cube = new THREE.Mesh(geometry, material);
    scene.add(cube);

    camera.position.z = 5;

    const animate = function () {
      requestAnimationFrame(animate);

      cube.rotation.x += 0.01;
      cube.rotation.y += 0.01;

      renderer.render(scene, camera);
    };

    animate();

    return { scene, camera, renderer };
  },
});
</script>

6.7、绘制一个球体

<template>
  <div ref="container"></div>
</template>

<script lang="ts">
import { defineComponent, onMounted, ref } from 'vue';
import * as THREE from 'three';

export default defineComponent({
  setup() {
    const container = ref(null);

    onMounted(() => {
      // 创建渲染器
      const renderer = new THREE.WebGLRenderer();
      renderer.setSize(window.innerWidth, window.innerHeight);

      // 将渲染器添加到DOM中
      if(container.value) {
        container.value.appendChild(renderer.domElement);
      }

      // 创建场景
      const scene = new THREE.Scene();

      // 创建相机
      const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
      camera.position.z = 5;

      // 添加环境光
      const ambientLight = new THREE.AmbientLight(0xffffff, 0.5);
      scene.add(ambientLight);

      // 添加点光源
      const pointLight = new THREE.PointLight(0xffffff, 1, 100);
      pointLight.position.set(0, 0, 5);
      scene.add(pointLight);

      // 创建红色球体
      const geometry = new THREE.SphereGeometry(1, 32, 32);
      const material = new THREE.MeshPhongMaterial({ color: 0xff0000, shininess: 100 });
      const sphere = new THREE.Mesh(geometry, material);
      scene.add(sphere);

      // 渲染场景
      const render = () => {
        requestAnimationFrame(render);
        sphere.rotation.x += 0.01;
        sphere.rotation.y += 0.01;
        renderer.render(scene, camera);
      };
      render();
    });

    return {
      container
    }
  }
});
</script>

在这个示例中,我们添加了一个点光源,并将球体的材质参数shininess设置为100,这使球体的表面更加光滑。

你还可以尝试调整环境光和点光源的强度和颜色,或者使用其他类型的光源和材质来改变球体的外观。

 

七、相关内容

canvas、canvas3D、playcanvas、tween、pixi、three.js、webGL、OpenGL

八、过程记录

8.1、学习目标

1、了解基础的3D数学和计算机图形学概念。学习向量、矩阵、坐标系、光照和着色器等基础知识。
2、熟悉WebGL技术,理解网页版3D渲染的基本原理,包括顶点着色器和片段着色器。
3、掌握Three.js的API,包括场景、相机、灯光、材质和几何体等基础概念,以及如何使用它们来创建3D图形。
4、学习如何使用Three.js创建复杂的3D场景,包括如何向场景添加3D模型、纹理、动画和粒子效果。
5、探索Three.js的高级功能,如阴影、反射、抗锯齿和后期处理。
6、将Three.js与其他技术集成,如HTML、CSS和JavaScript,以创建功能丰富且交互性强的3D应用程序。
7、学习如何与其他Web技术集成。将Three.js集成到Web应用程序中,并与其他技术,如HTML、CSS和JavaScript一起使用。
8、练习并参与开源项目,在实践中提高技能水平。
学习Three.js需要一定数学和图形学基础,需要耐心和实践。建议先从基础开始,逐步学习和实践,掌握基本概念和技能后再进行高级的应用。

8.2、Three.js之于WebGL,好比,jQuery.js之于JavaScript,,这样理解有合理性吗

这个比喻在某些方面是有合理性的,但不是完全准确的。 

类比中的相似之处在于,jQuery.js在JavaScript世界中扮演了许多网站开发人员的角色。Three.js也在WebGL世界中扮演着相似的角色。jQuery.js使用DOM元素并操作它们,类似地,Three.js使用WebGL上下文并操作它们。这是比喻的相似之处。

然而,WebGL在功能和范围上远远超过了DOM操作,因此Three.js提供了比jQuery.js更加复杂的功能和API。Three.js的目的是演示和创建3D图形和交互式应用程序,并且具有原生优化的性能。与jQuery.js不同,Three.js是专注于3D图形编程的库。

因此,比喻可以作为一种简单的概括,但它并不完全准确,并且可以误导人们对Three.js和WebGL的理解。

8.3、使用Three.js创建一个简单的立方体场景的基本步骤

1、设置照相机 camera = new THREE.Camera(); 用于观察物体
2、设置场景 scene = new THREE.Scene() 用于承载物体
3、建立物体 geometry = new THREE.CubeGeometry(200, 200, 200); 
4、创建网格 mesh = new THREE.Mesh(geometry, material) 5、渲染呈现 renderer.render(scene, camera) 这是啥

8.4、npm插件'three'和'@types/three'的区别如下

`npm`插件`three`是`Three.js`的`JavaScript`实现,是用于在`JavaScript`中创建和渲染`3D`图形的框架。

`@types/three`是TypeScript类型定义的`npm`包,它提供了`TypeScript`开发环境中`Three.js`库的类型定义文件。这些类型定义文件可以帮助`TypeScript`编译器检查代码类型,并提供提示和自动完成。

因此,`npm`插件`three`是`Three.js`库本身,而`@types/three`则提供了`TypeScript`开发环境所需的类型定义文件。如果你在使用`TypeScript`开发`Three.js`应用程序,则需要安装`npm`包`@types/three`,以获取`Three.js`库的类型定义文件,从而可以在开发过程中获得更好的类型安全支持和代码提示。如果你只是在使用标准的`JavaScript`进行开发,则只需要安装`npm`包`three`即可。

8.5、THREE.Geometry方法不存在新版本了吗

是的,从版本 r125 开始,three.js 废弃了 THREE.Geometry,并引入了 THREE.BufferGeometry 作为建模的首选选择。这是为了提高性能,并使开发人员更容易控制顶点数据。

因此,如果您使用的是最新版本的 three.js,建议使用 THREE.BufferGeometry 来代替 THREE.Geometry

8.6、需要在onmounted声明周期,确保DOM元素已经加载完成

需要注意的是,在使用Three.js时,需要确保DOM元素已经加载完成,否则会出现错误。上述示例中使用了安全访问运算符(?.)和类型断言(!),以确保能够正确获取DOM元素。

8.7、playcanvas.js 和 three.js 有什么相同异同

PlayCanvas和Three.js都是用于创建和显示3D图形的JavaScript库,但它们有一些关键的区别。

序号相同
1两者都是用于创建和显示3D图形的JavaScript库
2两者都提供了一系列的API来方便开发者创建和控制3D图形
3两者都支持在浏览器中运行,而且都能很好地支持各种主流的浏览器
4两者都提供了一些基本的3D功能,如3D模型的加载和呈现、材质和纹理的应用、动画和物理效果等
5两者都是开源的项目,并且都有一个活跃的社区在支持和维护
序号不同
1PlayCanvas.js的定位更多是在线多人游戏的开发,它在多人游戏的网络性能优化方面有更好的表现。而Three.js的应用范围更广泛,包括但不限于游戏开发,定位更多是用于3D呈现和交互式场景的创建。
2PlayCanvas提供了一套完整的游戏开发框架,包括物理引擎、碰撞检测、声音系统等,而Three.js主要专注于图形渲染。
3PlayCanvas提供了实时渲染功能,可以在浏览器中实现流畅的3D游戏体验,而Three.js虽然也支持实时渲染,但通常需要配合其他库(如WebGL或WebGPU)来实现更好的效果。
4PlayCanvas的文档和社区比Three.js更加完善,API更加简洁易用,对于开发者来说更容易上手和使用。而Three.js的API更加底层,需要开发者有一定的3D编程经验。
5PlayCanvas支持组件化开发,可以通过组合不同的组件来快速构建复杂的3D场景,而Three.js则需要更多的手动设置和调整。
6PlayCanvas支持多种输入方式(如键盘、鼠标、触摸等),适合开发各种类型的交互式应用,而Three.js则更侧重于图形渲染方面的输入控制。

九、老语法 --》新语法

序号老语法新语法
1

new THREE.FontLoader()

TextureLoader
THREE.TypefaceLoader
2

new THREE.TextGeometry()

THREE.TextBufferGeometry???
THREE.Mesh???
待补充待补充待补充

十、参考链接

补间动画tween.js_tween补间动画-CSDN博客

和我一起学 Three.js【初级篇】:2. 掌握几何体 - 知乎

关于javascript:Three.js新的THREE.TextBufferGeometry()无法读取未定义错误的属性’yMax’ | 码农家园

Three.js API手册 / LineBasicMaterial - 汇智网

Caught error TypeError: THREE.Geometry is not a constructor

Three.js中文网

https://www.cnblogs.com/tiandi/p/17053774.html

vue3项目中使用three.js的操作步骤_vue.js_脚本之家

开始第一个Hello world! | 码上动力

Lamborghini Huracán STO 2020

three.js全网最全最新入门课程(2023年10月更新)【搞定前端前沿技术】_哔哩哔哩_bilibili

threejs-vite-vue实战课程_哔哩哔哩_bilibili

带你入门three.js——从0到1实现一个3d可视化地图 - 知乎

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

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

相关文章

Gated Context Aggregation Network for Image Dehazing and Deraining(GCANet)

1 总体概述 GCANet是端到端去雾的一篇代表性的文章&#xff0c;它摒弃以往使用手工设计的先验以及大气散射模型的使用&#xff0c;直接通过原始有雾图像估计出无雾图像J与有雾图像I之间的残差&#xff0c;图像恢复阶段直接使用网络输出的残差与输入有雾图像I之间的加和完成去雾…

跨境电商商城源码,支持多语言,开启全球贸易新篇章!

随着全球化的不断深入&#xff0c;跨境电商已经成为越来越多企业的选择。我们为您提供的跨境电商源码产品&#xff0c;具有强大的多语言支持功能&#xff0c;可轻松扩展至多个语言&#xff0c;助您迅速占领全球市场&#xff0c;实现业务的国际化发展。 一、多语言支持&#xff…

uniapp蓝牙搜索设备并列表展示

1.需求&#xff1a;3.0的桩可以值扫码通过蓝牙名字直接绑定&#xff0c;2.0的桩二维码无蓝牙名称则需通过蓝牙列表来绑定 2.碰到问题 1.0 蓝牙列表需要去重&#xff08;蓝牙列表通过deviceId去重再放进展示列表&#xff09; 2.0页面会卡顿&#xff08;调用my.stopBluetoothDevi…

(附源码)基于spring boot 房屋租赁系统小程序-计算机毕设 88306

spring boot 房屋租赁系统小程序 目 录 摘要 1 绪论 1.1选题意义 1.2开发现状 1.3springboot框架介绍 1.4论文结构与章节安排 2 房屋租赁系统小程序系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.…

【Spring】AOP实现原理

注册AOP代理创建器 在平时开发过程中&#xff0c;如果想开启AOP&#xff0c;一般会使用EnableAspectJAutoProxy注解&#xff0c;这样在启动时&#xff0c;它会向Spring容器注册一个代理创建器用于创建代理对象&#xff0c;AOP使用的是AnnotationAwareAspectJAutoProxyCreator&…

MES系统数据集成系统源码

MES系统数据集成系统源码 1 MES的生产计划管理综述 生产计划的管理在MES系统中是非常重要的。我们知道&#xff0c;一般的情况下&#xff0c;企业的生产计划是由上层管理系统ERP来完成&#xff0c;那么MES中的生产计划和ERP的生产计划的不同点在于&#xff1a; ERP的生产计划…

选择振弦采集仪进行岩土工程监测时,根据不同工况选择合适的种类

选择振弦采集仪进行岩土工程监测时&#xff0c;根据不同工况选择合适的种类 岩土工程监测是保证工程质量和安全的重要手段。振弦采集仪是一种常用的岩土工程监测仪器&#xff0c;可用于对岩土工程场地振动环境的监测。它具有测量精度高、实时性强、易于安装、使用方便等特点。…

唯众技能大赛公开公平公正践行者

​近日&#xff0c;2023一带一路暨金砖国家技能发展与技术创新大赛网络综合布线赛项成功举办。唯众创始人辜渝傧对本次比赛情况就相关问题回答了记者提问。 采访人&#xff1a;第一个问题&#xff0c;咱们这一次“2023一带一路暨金砖国家技能发展与技术创新大赛之网络综合布线赛…

React【异步逻辑createAsyncThunk(一)、createAsyncThunk(二)、性能优化、createSelector】(十二)

文章目录 异步逻辑 createAsyncThunk&#xff08;一&#xff09; createAsyncThunk&#xff08;二&#xff09; 性能优化 createSelector 异步逻辑 //Product.js const onAdd () > {const name nameRef.current.value// 触发添加商品的事件dispatch(addProduct({name…

基于.NET的强大文件格式开源转换工具

推荐一个非常强大、轻便的强大文件格式转换工具。 01 项目简介 一个基于.NET平台的开源文件格式转换工具&#xff0c;可以支持Windows 7/8/10等操作系统。安装后在右键菜单中出现 “File Converter” 项目&#xff0c;可以方便地通过右键菜单对选中文件进行格式转换&#xff…

HALCON的python下的使用方法(直接开发,不需要调用.hdev文件)

一、环境配置方法 基本要求&#xff1a; Python版本>3.8 ; Halcon版本 >20.11 1&#xff09;首先创建一个python版本大于3.8的基础环境 2&#xff09;然后查看自己的halcon的版本&#xff0c;在该环境下安装halcon 如图所示&#xff0c;版本是20110&#xff0c;执行以…

Java,多线程,线程的两种创建方式

首先是多线程的一些相关概念&#xff1a; 相关概念&#xff1a; 程序&#xff08;program&#xff09;&#xff1a;为完成特定任务&#xff0c;用某种语言编写的一组指令的集合。即指一段静态&#xff08;指不在执行中&#xff09;的代码。 进程&#xff08;process&#xf…

十分钟了解回归测试

1. 什么是回归测试&#xff08;Regression Testing&#xff09; 回归测试是一个系统的质量控制过程&#xff0c;用于验证最近对软件的更改或更新是否无意中引入了新错误或对以前的功能方面产生了负面影响&#xff08;比如你在家中安装了新的空调系统&#xff0c;发现虽然新的空…

34 mysql limit 的实现

前言 这里来看一下 我们常见的 mysql 分页的 limit 的相的处理 这个问题的主要是来自于 之前有一个需要处理 大数据量的数据表的信息, 将数据转移到 es 中 然后就是用了最简单的 “select * from tz_test limit $pageOffset, $pageSize ” 来分页处理 但是由于 数据表的数…

[autojs]逍遥模拟器和vscode对接

第一步&#xff1a;启动autojs服务 第二步&#xff1a;去cmd查看ip地址&#xff0c;输入ipconfig 第三步&#xff1a;打开逍遥模拟器中的sutojs-左上角- 连接电脑&#xff0c;然后输入WLAN或者其他ip也行&#xff0c;根据自己电脑实际情况确认 此时vscode显示连接成功。我们写…

上传ipa到appstore最简单的方法

假如使用原生xcode开发ios的app&#xff0c;可以使用xcode提交打包好的ipa文件到app store&#xff0c;但是假如使用hbuilderx或者apicloud等H5工具开发的app&#xff0c;假如没有mac电脑&#xff0c;是无法将ipa提交到app store的。 因为苹果开发者并不能在线上传ipa到app st…

数据结构-图的应用

最小生成树&#xff08;最小代价树&#xff09; 对于一个带权连通无向图G(V,E)&#xff0c;生成树不同&#xff0c;每棵树的权&#xff08;即树中所有边上的权值之和)也可能不同。设R为G的所有生成树的集合&#xff0c;若T为R中边的权值之和最小的生成树&#xff0c;则T称为G的…

SPI简介及FPGA通用MOSI模块实现

简介 SPI&#xff08;Serial Peripheral Interface&#xff0c;串行外围设备接口&#xff09;通讯协议&#xff0c;是Motorola公司提出的一种同步串行接口技术。是一种高速、全双工、同步通信总线。在芯片中只占用四根管脚用来控制及数据传输。 优缺点&#xff1a; SPI通讯协…

VM17虚拟机设置网络,本地使用工具连接虚拟机

VM17虚拟机设置网络&#xff0c;本地使用工具连接虚拟机 下载及安装虚拟机不再说明&#xff0c;网络一堆教程。此处只对VM17设置网路及本地使用工具连接虚拟机操作&#xff0c;进行说明。 我下载的是VM17&#xff0c;网上有说VM16是较稳定的版本。想尝尝鲜&#xff0c;结果耗…

linux系统源码安装php5.6手把手教程

linux系统源码安装php5.6实用教程 1、下载php5.6安装包2、开始安装3、安装成功 1、下载php5.6安装包 wget http://mirrors.sohu.com/php/php-5.6.2.tar.gz在安装之前&#xff0c;我们需要安装php5.6编译时所依赖的软件包。如下&#xff1a; yum -y install gcc gcc-c lib2、开…