`
hjk685
  • 浏览: 103727 次
  • 来自: ...
社区版块
存档分类
最新评论

JME3 官方教程翻译 - 自定义网格形状

阅读更多

 

Custom Mesh Shapes

自定义网格形状

Use the Mesh class to create custom shapes that go beyond Quad, Box, Cylinder, and Sphere, even procedural shapes are possible. Thank you to KayTrance for providing the sample code!

In this tutorial, we (re)create a very simple rectangular mesh, and we have a look at different ways of coloring it. A flat rectangle may not look useful because it's exactly the same as a com.jme3.scene.shape.Quad. We choose this simple example in order to show you how to build any shape out of triangles – without the distractions of more complex shapes.

 

使用 Mesh 类来创建自定义形状,他超出了方形 、盒子、圆筒和球体等形状的,甚至来制作程序的形状也是可能的。在这里谢谢提供样品密码的 KayTrance, 谢谢你!

在这个指导中,我们 (关于)创建非常简单的矩形网格,而且我们用不同方法给它涂颜色。因为它完全和 same as a com.jme3.scene.shape.Quad 相同,所以一个平坦的长方形可能没有什么用。我们选择这个简单的例子主要为了要教你该如何从三角形建立任何想要的形状-没有比较复杂形状更有用处。

Polygon Meshes 多边形网格

Polygon meshes are made up of triangles. The corners of the triangles are vertices. So, when ever you create a new shape, you break it down into triangles.

 

多边形网格是由三角形组成的。三角形的角是顶点所以无论何时只要你创建新的形状,你都必须把它们拆散为三角形。

 

Let's look at a cube. A cube is made up of 6 rectangles. Each rectangle can be broken down into two triangles. This means you need 12 triangles to create a cube mesh. You also need to know the 8 corner coordinates (vertices). The trick is that you have to specify the vertices in a certain order: Each triangle separately, counter-clockwise.

 

我们先来分析一下立方体,一个立方体由 6 矩形构成,每一个矩形都可以分解为两个三角形。这一就是说你需要 12 个三角形来组成一个立方体网格。这时你就需要 8 个角的坐标(顶点)。所以你不得不按照一定顺序指定顶点。

Sounds worse than it is – here is an example:

实际比这还要糟糕(复杂)请看线面这个例子:

 

Creating a Quad Mesh 创建一个四边形网格

 

Okay, we want to create a Quad. A quad has four vertices, and is made up of two triangles.

 

好下面我们创建一个四边形。一个四边形包含四个顶点,由两个三角组成。

The base class for creating meshes is com.jme3.scene.Mesh.

基础的创建四边形的类是 com.jme3.scene.Mesh 。使用方法如下:

 

 

Mesh m = new Mesh();

 

 

Vertices 顶点

 

To define your own shape, determine its vertex positions in space. Store them in an array using com.jme3.math.Vector3f. For a Quad, we need four vertices: Bottom left, bottom right, top left, top right. We name the array vertices[].

 

确定你自己的形状,确定它所有的顶点在空间中的位置,用 com.jme3.math.Vector3f 这个类型的数组来储存它们。我们需要四个顶点,左下、右下、左上、右上,(这个顺序很重要)我们以 vertices[] 来命名这个数组。

 

 

Vector3f [] vertices = new Vector3f[4];

vertices[0] = new Vector3f(0,0,0);

vertices[1] = new Vector3f(3,0,0);

vertices[2] = new Vector3f(0,3,0);

vertices[3] = new Vector3f(3,3,0);

 

 

Texture Coordinates 纹理坐标

 

Next, define the Quad's 2D texture coordinates for each vertex, in the same order: Bottom left, bottom right, top left, top right. We name this array texCoord[]

 

下面,定义四边形每个顶点的 2D 纹理坐标,用和上面类似的方法:左下、右下、左上、右上。给这个数组起名字叫: texCoord[]

 

 

Vector2f[] texCoord = new Vector2f[4];

texCoord[0] = new Vector2f(0,0);

texCoord[1] = new Vector2f(1,0);

texCoord[2] = new Vector2f(0,1);

texCoord[3] = new Vector2f(1,1);

 

 

Connecting the Dots 链接这些点

 

Next we turn the unrelated coordinates into triangles – We define the order in which the mesh is constructed. Think of these indexes as coming in groups of three. Each group of indexes describes one triangle. Note that the vertices are giving counter-clockwise!

 

下面我们转换这些无关的坐标为一个三角形,我们定义创建哪些三角形的命令。想想这些索引会有三组, 每一个索引组描述一个三角。注意顶点是逆时针旋转的。

 

 

int [] indexes = { 2,0,1, 1,3,2 };

 

  • The 2,0,1 triangle starts at top left, continues bottom left, and ends at bottom right.
  • The 1,3,2 triangle start at bottom right, continues top right, and ends at top left.
  • 索引顺序 2,0,1 起始于左上角,经过左下角,最后在右下角结束。
  • 索引顺序 2,0,1 起始于右下角,经过右上角,在左上角结束。

 

 

2\ 2-3

|   \    |         Counter-clockwise 逆时针旋转。

|     \   |        

0–1\1

 

Setting the Mesh Buffer 设置网格缓冲器

 

The Mesh data is stored in a buffer. 网格数据被存储在一个缓冲器中。

  1. Using com.jme3.util.BufferUtils, we create three buffers for the three types of information we have:

使用 com.jme3.util.BufferUtils ,我们创建三个缓冲器对应我们三种不同类型的信息:

  1.  
    • vertex positions,
    • texture coordinates,
    • indices.
    • 顶点坐标
    • 纹理坐标
    • 索引顺序

 

  1. We assign the data to the appropriate type of buffer inside the mesh object. The three buffer types are taken from an enum in com.jme3.scene.VertexBuffer.Type.

在网格对象中我们分配这些数据到合适类型的缓冲器。这三个缓冲器类型来自于枚举类型类 com.jme3.scene.VertexBuffer.Type

  1. The third parameter describes the number of components of the values. Vertex postions are 3 float values, texture coordinates are 2 float values, and the indices are single ints.

这三个参数描述组成不同部分的值。顶点坐标是 3 float 值,纹理坐标是 2 float 值,索引是 int 类型。

 

 

m.setBuffer(Type.Position , 3, BufferUtils.createFloatBuffer(vertices));

m.setBuffer(Type.TexCoord, 2, BufferUtils.createFloatBuffer(texCoord));

m.setBuffer(Type.Index,    1, BufferUtils.createIntBuffer(indexes));

 

 

Our Mesh is ready! Now we want to see it. 这时网格已经做好了,我们来看看它。

 

Using the Mesh in a Scene 在场景里使用网格

 

We create a com.jme3.scene.Geometry, apply a simple color material to it, and attach it to the rootNode to make it appear in the scene.

我们创建一个 com.jme3.scene.Geometry 对象,给它使用一个简单的材质,在把它绑定到 rootNode 节点上让它出现在场景中。

 

Geometry geom = new Geometry("OurMesh", m);

Material mat = new Material(assetManager, "Common/MatDefs/Misc/SolidColor.j3md");

mat.setColor("m_Color", ColorRGBA.Blue);

geom.setMaterial(mat);

rootNode.attachChild(geom);

 

Ta-daa!

 

Optional: Vertex Colors 可选的:顶点颜色

 

Vertex coloring is a simple way of coloring meshes. Instead of just assigning one solid color, each vertex (corner) has a color assigned. The faces between the vertices are then colored with a gradient.

 

顶点颜色是一个给网格着色简单的方法。代替刚刚的单一颜色,每个顶点都给分配一种不同的颜色。这个面上的颜色就会有从一个顶点到另一个顶点颜色的过渡。

 

We will use the same mesh m as defined above, but with a special VertexColor material.

 

我们将使用相同的网格对象 m 但是使用特殊的顶点着色材质。

 

 

Geometry coloredMesh = new Geometry ("ColoredMesh", m);

Material matVC = new Material(assetManager, "Common/MatDefs/Misc/VertexColor.j3md");

 

 

We create a float array color buffer.

我们创建一个浮点型数组颜色缓冲器。

  • We assign 4 color values, RGBA, to each vertex.
    • To loop over the 4 color values, we use a color index
  • 我们先指定四个颜色值, RGBA, 给每一个顶点。
    • 在四个颜色值构成一个循环,我们使用颜色索引。

 

int colorIndex = 0;

 

  • The color buffer contains four color values for each vertex.
    • The Quad in this example has 4 vertices.
  • 颜色索引包含四个颜色值对应每个顶点
    • 四边形有四个顶点。

float[] colorArray = new float[4*4];

  •  
    • Tip: If your mesh has a different number of vertices, you would write:
    • 提示:如果你的网格有不同的顶点数,你应该写成:

float[] colorArray = new float[yourVertexCount * 4]

We loop over the colorArray buffer to quickly set some RGBA value for each vertex. As usual, RGBA color values range from 0.0f to 1.0f. The values we use here are quite arbitrary, we are just trying to give every vertex a different RGBA value (a purplish gray, purple, a greenish gray, green, in the screenshot), without writing too much code. For your own mesh, you'd choose the values the color buffer depending on which color you want the mesh to have.

 

我们循环这个颜色数组缓冲来快速设置 RGBA 的值给每一个顶点通常, RGBA 的值取于 0.0 1.0 之间,这里我们随意取几个数值,我们仅仅来给每一个顶点一个不同颜色的实验。(暗紫色、紫色、暗绿色、绿色)这些都没有太多的代码。对于我们的网格,需要选择你像个网格用的颜色值来替换掉颜色缓冲器中的颜色值。

 

for(int i = 0; i < 4; i++){

   // Red value (is increased by .2 on each next vertex here)

   colorArray[colorIndex++]= 0.1f+(.2f*i);

   // Green value (is reduced by .2 on each next vertex)

   colorArray[colorIndex++]= 0.9f-(0.2f*i);

   // Blue value (remains the same in our case)

   colorArray[colorIndex++]= 0.5f;

   // Alpha value (no transparency set here)

   colorArray[colorIndex++]= 1.0f;

}

 

Next, set the color buffer. An RGBA color value contains four float components, thus the parameter 4.

 

下面设置颜色缓冲器。一个 RGBA 颜色值包含了 4 个部分的值,所以这里参数用四。

 

 

m.setBuffer(Type.Color , 4, colorArray);

coloredMesh.setMaterial(matVC);

 

 

Now you see a gradient color extending from each vertex.

现在你可以看到渐变颜色从每一个顶点发射出来。

 

Optional: Point Mode 可选的:点模型

Alternatively, you can show the vertices as colored points instead of coloring the faces.

作为选择,你可以使用着色的点显示顶点,而不像上面一样显示面。

 

Geometry coloredMesh = new Geometry ("ColoredMesh", cMesh);

...

m.setMode(Mesh.Mode.Points);

m.setPointSize(10f);

m.updateBound();

m.setStatic();

Geometry points = new Geometry("Points", m);

points.setMaterial(mat);

rootNode.attachChild(points);

 

rootNode.attachChild(coloredMesh);

 

 

This will result in a 10 px dot being rendered for each of the four vertices. The dot has the vertex color you specified above. The Quad's faces are not rendered at all. This can be used for a special debugging or editing mode.

 

这种设置将使用十个像素点来渲染每一个顶点。这些点会精确地显示你指定的颜色。四边形的面不会被渲染,这种方式常被用在专用的测试或者编辑模型中。

 

Front and Back Faces 前后面

 

By default, jME3 optimizes a scene by culling all backfaces. It determines which side the front or backface of a mesh is by the order of the vertices. The frontface is the one where the vertices are specified counter-clockwise.

 

对于默认的情况, JME3 会使用剔除所有的背面的方式来优化场景。这就必须指出模型中哪些面是正面哪些面是反面,这个规定就是有顶点的顺序来得到的。正面是顶点链接顺序为逆时针方向的一面。

 

This means you mesh, as created above, is invisible when seen from “behind”. This may not be a problem and is often even intended. If you use the custom meshes to form a polyhedron, or flat wallpaper-like object, rendering the backfaces (the inside of the polyhedron) would indeed be a waste of resources.

 

 

这就是说刚才创建的网格从后面看是什么也看不到的。这可能不会出问题并且通常都会这么做。如果你使用自定义网格制作一个多面体,或者做一张壁纸,这时去渲染他的背面是很浪费资源的。

In case that your use case requires the backfaces to be visible, you have two options:

有时你需要同时显示正反两面时,你可以使用两种方式

  • If you have a very simple scene, you can just deactivate backface culling for this one mesh's material.
  • 如果你有一个简单的场景,你可以将该材质的剔除背面设置为无效。

 

mat.getAdditionalRenderState().setFaceCullMode(FaceCullMode.Off));

 

  • The recommended solution is to specify each triangle twice, the second time with the opposite order of vertices. The second, reversed triangle makes up the backface.
  • 一般的做法是在指定顶点链接索引时,每个三角面都指定两次,第二次指定时和第一次方向相反。正好就是第二次指定颠倒了第一次的顺序。
    int[] indexes = { 2,0,1, 1,3,2, 2,3,1, 1,0,2 };

 

我的代码

 

/**

  *

  * @author zbp

  */

public class MeshTer extends SimpleApplication{

 

    @Override

    public void simpleInitApp() {

        Mesh m=new Mesh();

        Quad qq=new Quad(5,2);

 

        // 顶点坐标

        Vector3f[] v=new Vector3f[5];

        v[0]= new Vector3f(0,0,0);

        v[1]=new Vector3f(0,2,0);

        v[2]=new Vector3f(1,2,0);

        v[3]=new Vector3f(1,0,0);

        v[4]=new Vector3f(2,1,0);

 

        // 纹理坐标

        Vector2f[] texCoord=new Vector2f[5];

        texCoord[0] = new Vector2f(0,0);

        texCoord[1] = new Vector2f(0,1);

        texCoord[2] = new Vector2f((float) 0.5,1);

        texCoord[3] = new Vector2f((float) 0.5,0);

        texCoord[4] = new Vector2f(1,1);

 

        // 连接索引

        int index[]={4,3,2,3,0,1,3,1,2};//

        //int index[]={0,3,1,1,3,2,2,3,4};// 只按照逆时针方向的规则来连接点,面可以全部显示 , 网格显示时有的边没有闭合

        //int index[]={0,1,3,1,3,2,2,3,4};// 1 个三角面顺时针转 ,面可以全部显示 , 网格显示时有的边没有闭合

        //int index[]={0,3,1, 1,2,3, 3,4,2};// 2 个三角面顺时针转,面可以全部显示 , 网格显示时有的边没有闭合

        //int index[]={0,3,1, 1,3,2, 2,4,3};// 3 个三角面顺时针转,面可以全部显示 , 网格显示时有的边没有闭合

        //int index[]={1,3,0, 1,2,3, 2,4,3};// 所有三角面顺时针转,面可以全部显示 , 网格显示时有的边没有闭合

        //int index[]={0,3,1,2,1,3,2,3,4};// 下一个三角面起点不是上一个的重点,面可以全部显示 , 网格显示时有的边没有闭合

 

        m.setBuffer(Type.Position,3, BufferUtils.createFloatBuffer(v));

        m.setBuffer(Type.TexCoord,2, BufferUtils.createFloatBuffer(texCoord));

        m.setBuffer(Type.Index, 1, BufferUtils.createIntBuffer(index));

 

        /* 以线框模式显示网格 */

        m.setMode(Mesh.Mode.LineLoop);//

        m.updateBound();

        m.setStatic();

        /* 结束 */

 

        Geometry g=new Geometry("myMesha",m);

        Material mm=new Material(assetManager, "Common/MatDefs/Misc/SolidColor.j3md");

        mm.setColor("m_Color", ColorRGBA.Blue);

        g.setMaterial(mm);

 

        this.rootNode.attachChild(g);

 

    }

   

    public static void main(String[] args) {

        MeshTer mt=new MeshTer();

        mt.start();

    }

 

}

 

通过我的实验,这个 index 是很重要。通过 index 中指定的顺序连接各个点,但是如果用线框模式显示时,就会有不闭合的边,很难看,但是现在还不知道是否影响程序。默认情况下绘制连接线时也是用的是 index 中的这个顺序,唯一不同的是顺序中的第一个点和最后一个点要单独再连接一次。

上图这种情况 031023 这个顺序也行,可能这个说明不太合适,有高手请给予指教。

 

 

 

  • 大小: 5.8 KB
分享到:
评论
3 楼 hjk685 2011-04-08  
对不起jasoncool,这么晚回复,这个问题我也没做过,但是你说的城市场景应该分为地形和建筑两块为主要内容,不应该是整体的(我认为),再者CAD生成地形我没做过,3DMax倒是做过,你要又需要联系我。
2 楼 jasoncool 2010-12-30  
网格形状是否可以使用在省城地形上呢?
我想通过CAD图形生成地形,不知道怎么从CAD的图里读取数据啊!
楼主有研究过吗?
1 楼 hjk685 2010-11-29  
本人翻译能力有限,所以使用中英文对照方式以供参考,大家看了有什么意见给我留言。

相关推荐

    JME中文教程.pdf

    - **自定义网格**:通过编写代码自定义模型的形状,例如创建一个简单的立方体。 ### 结语 jMonkeyEngine3以其强大的功能和简洁的API设计,在3D游戏开发领域占据了一席之地。无论是初学者还是经验丰富的开发者,都...

    Java M3G相关类.rar

    3. **Geometry**:几何对象是3D模型的基础,如三角形网格,可以用来创建复杂形状。 4. **Materials**:材质定义了物体表面的视觉属性,如颜色、反射率等。 5. **Textures**:纹理可以应用于几何对象,提供更丰富的...

    Qt 采用http通信json解析读取天气

    Qt 采用http通信json解析读取天气

    岗位晋升360度调查表.doc

    岗位晋升360度调查表.doc

    合法辞退员工的N种方式.pptx

    合法辞退员工的N种方式.pptx

    大模型、Agent、具身智能及人形机器人学习全路径规划.pdf

    大模型、Agent、具身智能及人形机器人学习全路径规划.pdf

    华润万家员工手册.doc

    华润万家员工手册.doc

    招聘需求分析.xls

    招聘需求分析.xls

    光伏+蓄电池系统中双有源桥DC-DC变换器的Matlab仿真与MPPT及闭环控制实现

    内容概要:本文详细介绍了基于‘光伏(PV)+蓄电池+负载’架构的双有源桥DC-DC变换器仿真方法及其在Matlab 2021b中的具体实现。首先解析了光伏系统的MPPT控制,通过扰动观察法使光伏板始终处于最大功率点。接着讨论了蓄电池的恒流充放电控制,利用PI控制器确保电池的安全和高效运作。然后阐述了双有源桥DC-DC变换器的闭环控制机制,借助PID控制器维持系统输出电压的稳定性。最后,文章展示了如何在Matlab Simulink环境下构建完整的仿真模型,涵盖各模块间的电气连接与信号交互,为新能源系统的优化提供了理论和技术支持。 适合人群:从事电力电子、新能源系统设计的研究人员和工程师,尤其是那些需要深入了解光伏储能系统工作原理的人群。 使用场景及目标:适用于希望掌握光伏储能系统中关键组件如MPPT、恒流充放电控制及双有源桥DC-DC变换器的设计与仿真的技术人员。目标是在实际工程项目中提高系统的效率和可靠性。 其他说明:文中提供的代码片段和建模思路有助于读者更好地理解和实践相关技术,同时也强调了一些常见的陷阱和调试技巧,帮助避免潜在的问题。

    数学建模_Matlab_SPSS_教程分享_学习用途_1742838826.zip

    线性代数

    电机调速技术解析:直流电机双闭环与多种电机滞环调速方法对比

    内容概要:本文详细介绍了不同类型电机的调速方法,重点探讨了直流电机双闭环调速、永磁同步电机电流滞环闭环调速以及异步电机滞环电流调速。文中不仅提供了每种调速方法的基本原理和技术特点,还附带了相应的代码示例进行辅助解释。此外,文章对永磁同步电机的电流滞环调速与SVPWM调速进行了对比,指出了各自的优劣之处。最后,强调了在实际应用中选择合适调速方案的重要性。 适合人群:从事电机控制系统设计与开发的技术人员,尤其是有一定电机控制基础的研发人员。 使用场景及目标:适用于需要深入了解电机调速机制及其应用场景的专业人士。目标是帮助读者掌握不同电机调速方法的特点,以便在实际工程中做出最优选择。 其他说明:文章通过具体的代码实例展示了调速方法的实际应用,使读者能够更好地理解和实践相关技术。同时提醒读者在实际调试过程中要注意参数设置和硬件条件的影响。

    人员晋升推荐表.xls

    人员晋升推荐表.xls

    员工生日关怀方案.doc

    员工生日关怀方案

    模拟IC设计:解析国际知名大厂的SAR、Sigma-Delta和Pipeline ADC逆向工程

    内容概要:本文详细介绍了对国际知名大厂的三个逆向ADC电路(SAR ADC、Sigma-Delta ADC和Pipeline ADC)进行深入剖析。作者通过Cadence Virtuoso平台研究了这些电路的标准单元库设计,探讨了各个电路的关键技术和实现细节。对于24bit Sigma-Delta ADC,重点讨论了其调制器部分的时钟相位分配和噪声整形技术;对于16bit SAR ADC,则关注其比较器阵列的独特设计以及动态锁存比较器的应用;而对于14bit Pipeline ADC,着重分析了其级间放大器设计和电荷共享技术。此外,文中还提到了在将这些设计适配到自家工艺过程中遇到的问题及其解决方案,如电容寄生效应、时序约束调整、运放结构优化等。 适合人群:从事模拟集成电路设计的专业人士,尤其是对ADC设计感兴趣的工程师和技术研究人员。 使用场景及目标:帮助读者深入了解高精度ADC的工作原理和设计技巧,掌握逆向工程技术在实际项目中的应用,提高对不同工艺节点下ADC设计的理解和适应能力。 其他说明:文中提供了大量具体的代码片段和仿真命令,便于读者理解和实践。同时,作者分享了许多宝贵的经验教训,强调了在逆向工程中需要注意的技术细节和潜在风险。

    大型立体仓库智能物流系统的PLC控制与优化设计

    内容概要:本文详细介绍了大型立体仓库智能物流系统的构建与优化。该项目涉及一万多个库位、一百多台输送机和八台堆垛机,采用了西门子PLC作为控制核心,通过无线网桥与WCS和WMS系统对接。文章重点讲解了梯形图编程和功能块的应用,如输送机启停控制、堆垛机移动控制、路径规划、无线通讯处理以及异常处理机制。此外,还探讨了设备协同、逻辑优化、任务分配算法和速度曲线规划等方面的技术细节。 适合人群:从事工业自动化、智能仓储系统设计与开发的工程师和技术爱好者。 使用场景及目标:适用于智能仓储系统的设计、实施和维护,旨在提高系统的稳定性、效率和可维护性。 其他说明:文中提供了大量实际项目中的代码示例和调试经验,有助于读者理解和应用相关技术。

    新员工月工作总结表.xlsx

    新员工月工作总结表.xlsx

    西门子PLC汽车电子零件装配线SCL语言模块化编程与集成解决方案

    内容概要:本文详细介绍了基于西门子S7-1500 PLC的汽车电子零件装配线集成解决方案。主要内容涵盖伺服轴控制、阿特拉斯拧紧枪控制、康耐视视觉检测系统以及HMI界面的设计与实现。文中展示了如何利用SCL语言将多种工业设备(如HMI、伺服电机、六轴机器人等)的功能封装为标准化功能块,从而提高系统的模块化程度和可复用性。同时,还分享了一些实际项目中的调试经验和优化技巧,如通过调整加减速曲线避免机械振动、设置扭矩保持时间和视觉检测的防抖定时器等。 适合人群:从事自动化控制领域的工程师和技术人员,尤其是熟悉PLC编程和工业自动化设备集成的专业人士。 使用场景及目标:适用于汽车制造行业的生产线控制系统设计与实施。主要目标是帮助工程师快速掌握如何使用SCL语言构建高效稳定的PLC控制系统,提升生产效率和产品质量。 其他说明:文中不仅提供了详细的代码示例,还结合具体的应用场景进行了深入剖析,有助于读者更好地理解和应用相关技术。此外,强调了模块化编程的优势,如减少重复劳动、便于维护升级等。

    嵌入式系统中基于STM32/AT32/GD32的串口IAP Bootloader实现与远程升级方案

    内容概要:本文详细介绍了如何在STM32、AT32和GD32等Cortex-M系列MCU上实现串口IAP(In Application Programming)Bootloader,支持远程升级及RS485升级。主要内容涵盖Bootloader的工作原理、内存分配、通信协议设计、Flash写入操作以及跳转应用程序的关键步骤。文中提供了具体的代码示例,如Bootloader主循环、RS485收发控制、Flash写入、CRC校验等,并分享了多个实战经验和注意事项,确保数据传输的可靠性。 适合人群:从事嵌入式系统开发的技术人员,尤其是对STM32、AT32、GD32等国产MCU有一定了解并希望掌握串口IAP技术的研发人员。 使用场景及目标:适用于需要远程升级固件的嵌入式项目,帮助开发者避免现场升级带来的不便,提高设备维护效率。目标是让读者能够独立实现一个可靠的串口IAP Bootloader,掌握RS485通信和Flash编程的关键技术。 其他说明:文中提到的代码和配置已在GitHub上提供,方便读者下载和实践。同时,作者分享了许多实战经验和常见问题解决方案,有助于减少开发过程中可能出现的问题。

    线性代数_矩阵运算_方程组解释_MIT公开课笔记用途_1742822302.zip

    线性代数

    学生会干部竞选清心简约.pptx

    学生会干部竞选清心简约.pptx

Global site tag (gtag.js) - Google Analytics