欢迎来到WebGL教程的第一课!这一课以NeHe OpenGL教程的第二课内容为基础,NeHe OpenGL是一套针对游戏开发人员讲解3D图形技术的流行教程。本课将向你显示如何在一个网页上绘制一个三角形和一个正方形。也许它本身并不令人激动,但它却是一个不错的WebGL基础介绍;如果你理解它是如何工作的,那么剩下的学习将变得很简单......



在支持WebGL的浏览器上运行本课代码显示如下:



如果你已经有了一个支持webGL的浏览器,点击此处你将看到WebGL的实时版;如果你还没有,从这里你可以获取一个。



更多关于它是如何工作的细节,请看下面......



一点提示:这些课程是面向那些具有一定编程知识但没有实际3D图形开发经验的开发人员的;其目的是让你对代码层上发生了什么事有很好的理解,以便你能尽可能快地创建出自己的3D网页。我一边自学WebGL一边写这个教程,因此有可能(甚至很有可能)有些概念是错误的;然而,一旦我知道有错误,我就会去修改和纠正它们。所以,如果你发现什么错误的话,请留言让我知道。



获取这个例子的代码有两种方法:一种就是当你观看实时版的时候点击“查看源码”的链接,另一种是你从GitHub的代码库获取(包括以后课程的代码)。对于任一种方式,一旦你获得源码,你就可以用你喜欢的文本编辑器打开并查看它。即使你已经比较熟悉OpenGL,但是当你初次见到它时,你也会望而生畏。首先,我们定义一对渲染器,一般认为渲染器相对高级一些。但是不要害怕,它实际上比它看起来要简单一些。



像大多数程序一样,这个WebGL网页从定义一些下层函数开始,它们被位于网页底部的上层代码调用。为了解释这个问题,我将按照我的方式从网页底部开始介绍它们。因此,如果你正在浏览代码,请跳到网页的底部。

你将看到下面的html代码:

body οnlοad="webGLStart();">
a href="http://learningwebgl.com/blog/?p=28"><< Back to Lesson 1

canvas id="lesson01-canvas" style="border: none;" width="500" height="500">

a href="http://learningwebgl.com/blog/?p=28"><< Back to Lesson 1

/body>
这是一个网页完整的body部分,其他的代码是在JavaScript中(如果你是通过“查看源码”方式得到这个代码的话,会看到一些额外用于网站分析的代码,你可以忽略它们)。显然,我们可以将任何数量的普通HTML标签放入body标签内,并在一个普通网页里创建我们的WebGL图像,但是对于这个简单的演示来说,我们只是得到WebGL以及返回到这个博客帖子的链接。同时,canvas标签是3D图形放置的地方。canvas是html5.0的新特性——它允许JavaScript脚本在网页中绘制二维和三维(通过WebGL)元素。我们不会指定多于canvas标签本身简单布局属性的其他属性,相反,我们将所有WebGL的安装代码放置在一个叫做webGLStart的JavaScript函数中,一旦网页被装载,这个函数就会被调用。

 
现在让我们向上翻到这个函数,来看一看它:
function webGLStart() {

var canvas = document.getElementById("lesson01-canvas");

  initGL(canvas);

  initShaders();

  initBuffers();

  gl.clearColor(0.0, 0.0, 0.0, 1.0);

  gl.clearDepth(1.0);

  gl.enable(gl.DEPTH_TEST);

  gl.depthFunc(gl.LEQUAL);

  setInterval(drawScene, 15);

}

它调用函数来初始化我们前面提到的WebGL和渲染器,传入前面我们想要绘制三维物体的canvas元素,接着它使用initBuffers函数初始化缓冲区;缓冲区用来保留我们要绘制的三角形和正方形的细节——稍后我们将更多地谈论此问题。接下来,它对GL引擎做了一些基本设置,就是说当我们清除画布的时候我们应该使其变黑,以及清除操作应当百分之百的清除掉我们正在绘制的物体。同时,我们应该做深度测试(以使位于其它物体后面的被绘制物体隐藏在它们前面的物体之后)。最后,我们使用setInterval函数每隔15毫秒就调用一次drawScene函数。根据函数名就可以知道,drawScene函数是通过使用缓冲区来绘制物体的。





稍后我们将回到initGL和initShaders函数上,因为它们对于理解网页如何工作是很重要的。现在让我们先来看看initBuffers和drawScene函数。
var triangleVertexPositionBuffer;
var squareVertexPositionBuffer;



我们声明了两个全局变量来保存缓冲区。(在一个真实的WebGL网页中,你不用对场景中的每一个对象声明一个单独的全局变量,但在这里我们使用它们是为了在第一课中让事情变得简单些 :-)

接下来:
function initBuffers() {
triangleVertexPositionBuffer =gl.createBuffer();



我们为三角形顶点的位置创建一个缓冲区。顶点是三维空间中定义我们正在绘制的图形的形状的点。对于三角形,我们有三个这样的点(稍后我们将设置)。这个缓冲区实际上是图形卡上的内存;在初始化代码中将顶点位置放置在图形卡上,当重绘时,本质上只是告诉WebGL去“绘制先前我告诉你要绘制的物体”。这样,我们就可以使代码运行起来十分有效率。当然,在此例中我们只有三个顶点,将它们绘制到图形卡上不会花费太多的代价——但是当你处理具有成千上万个顶点的大型模型时,用这种方法处理将体现出其真正的优势。

gl.bindBuffer(gl.ARRAY_BUFFER, triangleVertexPositionBuffer);
这行代码告诉WebGL以下任何在缓冲区上的操作都应该使用我们指定的缓冲区。这里有一个“当前数组缓冲区”的概念,以及工作在其上的函数,而不是让你自行定义数组缓冲区。听上去有点奇怪
,但我确信这样做是为了获得良好的性能。
var vertices = [

   0.0,  1.0,  0.0,

   -1.0, -1.0,  0.0,

   1.0, -1.0,  0.0

];



接下来,我们用一个JavaScript数组定义顶点位置。可以看到它们位于一个中心为(0,0,0)的等腰三角形的顶点上。

gl.bufferData(gl.ARRAY_BUFFER,new WebGLFloatArray(vertices),gl.STATIC_DRAW);



现在,我们创建一个基于这个JavaScript数组的WebGLFloatArray对象,指示WebGL使用它来填充当前的缓冲区,即triangleVertexPositionBuffer。在后面的课程中我们将更多地谈论WebGLFloatArrays,不过现在你只需知道,它是一种将JavaScript数组转换成某种数据的方法,这种数据我们用来传递给WebGL,以填充其缓冲区。

triangleVertexPositionBuffer.itemSize = 3;

triangleVertexPositionBuffer.numItems = 3;



最后,我们对缓冲区设置两个新的属性。WebGL没有内置这两个属性,但是稍后它们将变得非常有用。一件关于JavaScript的好事情(某些人会说是坏事情)是一个对象不必显式地支持某个你想给它设置的属性。因此,尽管这个缓冲区对象以前没有itemSize和numItems属性,但是现在它具有了这样的属性。我们使用它们来表示这个具有9个元素的缓冲区,该缓冲区实际上表示了三个独立的顶点位置(numItems),其中每一个由三个数(itemSize)组成。




我们已经完全设置好了三角形的缓冲区,现在轮到正方形了:

squareVertexPositionBuffer = gl.createBuffer();

gl.bindBuffer(gl.ARRAY_BUFFER, squareVertexPositionBuffer);

vertices = [

  1.0,  1.0,  0.0,

  -1.0,  1.0,  0.0,

  1.0, -1.0,  0.0,

  -1.0, -1.0,  0.0

];

  gl.bufferData(gl.ARRAY_BUFFER, new WebGLFloatArray(vertices), gl.STATIC_DRAW);

  squareVertexPositionBuffer.itemSize = 3;

  squareVertexPositionBuffer.numItems = 4;

}



所有这些都很明显——正方形有4个顶点而不是3个,因此数组要大一些而且numItems的值不同。



好了,我们所要做的是将两个对象的顶点位置放置到图形卡上。现在让我们看看drawScene函数,这个函数是我们使用缓冲区真正绘制我们所看到图形的地方。让我们一步步来看看它:
function drawScene() {

gl.clear(gl.COLOR_BUFFER_BIT |gl.DEPTH_BUFFER_BIT);



第一步:清除画布,以便在画布上绘制图形。接下来:

    perspective(45, 1.0, 0.1, 100.0);



此处我们为想要观看的场景设置透视参数。默认情况下,WebGL将绘制与远端物体同尺寸的近端物体(一种称为正投影的三维类型)。为了使较远的物体看起来较小,需要告诉它一些正在使用的透视参数。对于这个场景,我们的(垂直)视野是45°,画布的宽高比是1:1,我们不想看到那些距离观察点近于0.1个单位的物体,也不想看到那些距离观察点远于100个单位的物体。



这个perspective 函数十分有用,但它并不内置于WebGL,因此,它在代码中被定义为应用函数。稍后我将更详细地描述它是如何工作的,但是在不知其细节的情况下也应该清楚如何使用它。

现在我们已经设置好perspective函数,我们可以继续绘制一些物体:

    loadIdentity();



第一步是“移动”到三维场景的中心。在OpenGL中,当我们绘制一个场景时,你要告诉它用“当前的”旋转方法在“当前的”位置上绘制每一个物体——因此,例如你说“向前移动20个单位,旋转32度,接着绘制机器人”,这非常有用,因为你能将“绘制机器人”的代码封装在一个函数中,然后,只需在调用函数前改变“平移/旋转”参数,就能轻松绘制机器人。当前的位置和旋转信息放在一个矩阵中;正如你可能在学校了解的一样,矩阵可以表示平移(从一个位置到另一个位置的移动),旋转和其他几何变换。现在我不想讲得太多,你可以用一个4×4(不是3×3)的矩阵来表示三维空间的任何变换;你从单位矩阵开始——这种矩阵表示一种什么都不做的变换——,用第一个变换矩阵与之相乘,接着乘以第二个变换矩阵,以此类推。合并后的矩阵在一个变换中表示了所有的变换。


我们使用的这个矩阵表示了模型视图矩阵的当前平移/旋转状态,现在你可能已经编制好了loadIdentity函数,该函数将模型视图矩阵转换为单位矩阵,我们可以将其相乘并旋转以得到它。换句话说,它使我们从一个原始的点出发,开始绘制三维世界。

细心的读者可能会发现,一开始我讨论矩阵的时候说的是“在OpenGL中”而不是“在WebGL中”。这是因为像perspective函数一样,WebGL没有内置这样的函数;我们不得不自己实现它,或者拷贝一个已经实现好的应用函数。再说一下,我稍后将详细地解释这些应用函数是如何工作的,不过你在不了解其细节的情况下也能使用它们。

让我们看一看绘制在画布左边的三角形的代码。

    mvTranslate([-1.5, 0.0, -7.0]);



loadIdentity函数使其移动到三维空间的中心。我们通过向左移动1.5个单位(即沿着X轴的负方向)和向场景中移动7个单位(即远离观察者的方向,也就是沿着Z轴的负方向)开始绘制三角形。(正如你可能猜到的一样,mvTranslate函数通过模型视图矩阵乘以一个带有下列参数的变换矩阵做了一次底层变换。)




下一步真正开始绘制图形了!

gl.bindBuffer(gl.ARRAY_BUFFER, triangleVertexPositionBuffer);

gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, triangleVertexPositionBuffer.itemSize, gl.FLOAT, false, 0, 0);



因此,你要记住为了使用其中的一个缓冲区,我们将调用gl.bindBuffer函数来指定一个当前的缓冲区,接着调用在缓冲区执行的代码。我们选择 triangleVertexPositionBuffer来告诉WebGL哪些值应该被用于顶点位置。稍后我将更多地解释其如何工作;现在,你能看到我们正在使用itemSize属性,该属性是我们设置在缓冲区上用来告诉WebGL缓冲区的每项有3个数大小。

接下来我们使用

setMatrixUniforms();

告诉WebGL考虑当前的模型视图矩阵(以及投影矩阵,稍后有详细的解释)。这是必须的,因为WebGL没有内置这个矩阵的参数,但是这些都发生在JavaScript私有域中。setMatrixUniforms把矩阵参数传到图形卡。
一旦完成这个函数,WebGL将要处理一组被看做是顶点位置和关于我们矩阵的数值。下一步是告诉WebGL怎么处理这些数值:

gl.drawArrays(gl.TRIANGLES,0,triangleVertexPositionBuffer.numItems);
从顶点数组的第0项开始一直到第numItems个元素,将顶点数组绘制成三角形。

一旦这个过程结束,WebGL就绘制好了三角形。下一步,我们来绘制正方形:
mvTranslate([3.0, 0.0, 0.0])

我们一开始将模型视图矩阵向右移动3个单位。记住,我们当前已经向左移动了1.5个单位并远离了屏幕7个单位,因此这次我们只需向右移动1.5个单位,向屏幕移动7个单位。接下来:

gl.bindBuffer(gl.ARRAY_BUFFER, squareVertexPositionBuffer);

gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute,squareVertexPositionBuffer.itemSize, gl.FLOAT, false, 0, 0);

我们告诉WebGL使用正方形顶点位置的缓冲区…
setMatrixUniforms();

我们再次推到模型视图矩阵和投影矩阵,以至于我们能考虑到最近使用的mvTranslate函数,这意味着我们最终可以绘制这些点。
gl.drawArrays(gl.TRIANGLE_STRIP,0,squareVertexPositionBuffer.numItems);

你可能会问:什么是三角形带?嗯,它是一个三角形的条带:)说详细点,三角形带中的头三个顶点定义了第一个三角形,接着这三个顶点中的后两个与下一个顶点一起定义了下一个三角形,以此类推。此例是一种快速的定义正方形的方法。在更复杂的情况下,根据与其近似的由许多三角形组成的图形来定义一个复杂表面可能会是一种真正有用的方法。

总之,一旦完成这个过程,drawScene函数就结束了。
}


到此,你完全可以开始一些实验。从GitHub或者直接从实时版本中拷贝代码到本地文件中;如果你选择后者,你需要用到index.html,sylvester.js和glUtils.js这三个文件。在本地运行代码并确保其可以正常工作,接着尝试改变一些上面提到的顶点位置;特别地,场景立刻会变得十分平坦;尝试改变正方形的Z值为2或-3,你将看到它随着向后或向前移动而变得更大或更小。或者尝试只改变一个或两个顶点,你将发现它会出现视角上的扭曲。


现在我们来看看刚才我们忽略的一些函数。正如我前面所说,如果你愿意忽视这些细节而仅仅是拷贝和粘帖这些在initBuffers函数之前出现的函数,你很有可能侥幸创建出有趣的WebGL页面(哪怕还只是黑白的——彩色在下一课介绍)。但是这些细节并非很难理解,同时通过理解它们是如何工作的有助于你将来写出更好的WebGL代码。

继续和我一起看看这些细节吗?谢谢:-)首先让我们回避一些最为乏味的函数;第一个被webGLStart调用的函数是initGL。它靠近网页顶部,拷贝在下面以供参考:
var gl;
function initGL(canvas) {
  try {
    gl = canvas.getContext("experimental-webgl");
    gl.viewport(0, 0, canvas.width, canvas.height);
} catch(e) {


}
  if (!gl) {
    alert("Could not initialise WebGL, sorry :-(");
  }
}


这个函数非常简单。你可能已经注意到,initBuffers和drawScene函数经常涉及一个叫做gl的对象,很明显该对象牵涉某种WebGL核心。这个函数获取了这一核心——称为WebGL context,它是通过使用标准的context名称请求canvas赋予的(你可能猜测,在某个时候context的名字将从“experimental-webgl”变成“webgl”,那时我将更新我的课程和博客)。一旦得到上下文,我们将使用viewport函数告诉WebGL画布的大小;在后面的课程中我们会回过来讲讲这为什么会很重要;现在,你只需知道该函数调用时需要画布的大小。一旦函数执行完,GL的context就设置好了。



调用initGL之后,webGLStart调用initShaders。这个函数用来初始化渲染器。我们稍后再回来看这个函数,因为我们首先要来看看处理模型视图矩阵的应用函数。下面是其代码:
var mvMatrix;
function loadIdentity() {
  mvMatrix = Matrix.I(4);
}
function multMatrix(m) {
  mvMatrix = mvMatrix.x(m);
}
function mvTranslate(v) {
  var m = Matrix.Translation($V([v[0], v[1], v[2]])).ensure4x4();
  multMatrix(m);
}


我们定义mvMatrix变量来保存模型视图矩阵,接着定义使用该变量的loadIdentity和mvTranslate函数以及multMatrix应用函数。如果你知道JavaScript,你就会明白我们在此使用的矩阵代数函数并不是一般的JavaScript的API;事实上它们由先前提到的两个文件所支持,这两个文件位于HTML网页的顶部:


第一个文件, Sylvester,是一个处理矩阵和矢量代数的开源JavaScript库,第二个文件是由Vladimir Vukićević开发的Sylvester库的一系列扩展。



总之,在这些简单函数和有用的库文件的帮助下,我们可以维护模型视图矩阵。这里需要说明另一个矩阵,就是我前面提到的投影矩阵。你也许记得,WebGL不内置perspective函数。但是模型视图矩阵封装了像移动和旋转物体这样的过程,这正是矩阵擅长的事情。你现在肯定已经猜到,投影矩阵正是这么一个矩阵。下面是其代码:

var pMatrix;




function perspective(fovy, aspect, znear, zfar) {




  pMatrix = makePerspective(fovy, aspect, znear, zfar);

}

makePerspective函数是另一个定义在glUtils.js文件中的函数;它返回一个我们需要应用在指定的全景透视图中的特定矩阵。



现在,我们除了setMatrixUniforms函数外已经浏览了所有函数,正如我先前所说,这个函数将模型视图矩阵和投影矩阵从JavaScript中转移到WebGL中,并与渲染器相关。由于它们相互关联,所以我们将从一些背景知识开始。



你也许会问:什么是渲染器?在三维图形的历史上,渲染器

曾经“名副其实”过:在绘制一个场景之前,它指示系统如何渲染或着色。然而,随着时间的推移,它的功能日益增强,以至于如今要这样定义它才更为合适:渲染器是这样一些代码,在一个场景开始绘制之前,它能对场景的任何部分做任何处理。这的确十分有用,由于它运行在图形卡上,所以它能很快运行且能很便利地做各种变换,哪怕是在这个简单的例子中。



我们引入渲染器是为了一个简单的WebGL例子(在OpenGL教程中这至少算是“中级”),该例子能运行在图形卡上且使用渲染器获得WebGL系统。它把模型视图矩阵和投影矩阵应用到场景中,而不需要使用相对较慢的JavaScript来移动场景中的每一个点和每一个三角形顶点。这相当有用并且值得额外的开销。



下面是如何设置它们。正如你所记得的,webGLStart函数调用initShaders函数,那么让我们一步一步地来看一看:

var shaderProgram;

function initShaders() {

  var fragmentShader = getShader(gl, "shader-fs");

  var vertexShader = getShader(gl, "shader-vs");

  shaderProgram = gl.createProgram();

  gl.attachShader(shaderProgram, vertexShader);

  gl.attachShader(shaderProgram, fragmentShader);

  gl.linkProgram(shaderProgram);

  if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {

    alert("Could not initialise shaders");

  }

  gl.useProgram(shaderProgram);



正如你所见,它使用getShader函数来获得两个渲染器:一个片段渲染器和一个顶点渲染器,接着将两者绑定在一个WebGL“程序”上。一个程序是一段放置在系统WebGL上的代码;你可以把它视作一种运行在图形卡上的特定方式。正如你所期望的,你可以将它和一些渲染器联系在一起,每个渲染器都可以视为程序中的一个代码片段;确切地说,每个程序可以拥有一个片段渲染器和一个顶点渲染器。让我们简单地看一下:
shaderProgram.vertexPositionAttribute =
gl.getAttribLocation(shaderProgram, "aVertexPosition");
gl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute);


 
一旦设置好程序并绑定了渲染器,函数将得到一个“属性”的引用,该属性存储在vertexPositionAttribute对象中。我们再次利用JavaScript把任一字段设置在任一对象上;默认情况下对象没有vertexPositionAttribute字段,但是对于我们来说将两个值保留在一起是很方便的,因此我们仅设置程序中新字段的属性。



那么,vertexPositionAttribute是做什么的呢?也许你还记得,我们在drawScene函数中使用过它;如果你回过去看一看从适当的缓冲区设置三角形顶点位置的那段代码,你将看到我们所做的就是将缓冲区与该属性关联在一起。稍后你将明白这是什么意思。现在,只需注意到我们也使用gl.enableVertexAttribArray函数来指示WebGL使用一个数组来为该属性提供数值。
shaderProgram.pMatrixUniform =
        gl.getUniformLocation(shaderProgram, "uPMatrix");
shaderProgram.mvMatrixUniform =
        gl.getUniformLocation(shaderProgram, "uMVMatrix");
}



initShaders函数所做的最后一件事就是从程序中获取两个多的值,这两个变量称作uniform变量,我们很快会再遇见它们,但现在你只需注意到,正如属性一样,我们为了方便而将其存储在对象中。



现在,我们来看看getShader函数:
function getShader(gl, id) {
  var shaderScript = document.getElementById(id);
  if (!shaderScript) {
      return null;
  }
  var str = "";
  var k = shaderScript.firstChild;
  while (k) {
    if (k.nodeType == 3)
        str += k.textContent;
        k = k.nextSibling;
    }
  var shader;
  if (shaderScript.type == "x-shader/x-fragment") {
      shader = gl.createShader(gl.FRAGMENT_SHADER);
  }
  else if (shaderScript.type == "x-shader/x-vertex") {
      shader = gl.createShader(gl.VERTEX_SHADER);
  }
  else {
      return null;
  }
  gl.shaderSource(shader, str);
  gl.compileShader(shader);
  if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
      alert(gl.getShaderInfoLog(shader));
      return null;
  }
  return shader;
}

这是另一个比看起来要简单的函数。我们要做的是在HTML网页中寻找一个元素,其具有与传入参数匹配的ID,取出其内容并基于其类型创建一个片段渲染器或者一个顶点渲染器(以后我们将更多地解释它们的区别),接着将其传入到WebGL中编译成可以在图形卡上运行的形式。接下来,代码进行出错处理,最后完成整个处理。当然,我们只能在JavaScript中将渲染器定义为字符串而不能从HTML中提取——通过这样做,我们使其更易读,因为它们被定义为网页中的脚本,就像它们本身就是JavaScript一样。

 
看完这个以后,我们应该来看看渲染器的代码:
关于这些你要记住的第一件事就是:这些代码不是用JavaScript所写,即使这两种脚本语言的祖先十分相似。事实上,它们使用一种特殊的与C语言有很大关系的渲染器语言(当然,JavaScript也是如此)所写。第一个渲染器——即片段渲染器——什么也不做;它简单地规定了被绘制的物体将被绘制成白色(怎么给物体着色是下一节课程的话题)。第二个渲染器有点意思,它是一个顶点渲染器——还记得吧,它是一段图形卡上的代码,能用一个顶点完成它想做的任何事。与之相关联的是,它有两个uniform变量:uMVMatrix和uPMatrix。uniform变量十分有用,因为它们能在渲染器之外获得——实际上是在包含它们的程序之外,你可能还记得,当时我们从initShaders函数获得了它们,它们也可以从将其设置为模型视图矩阵和投影矩阵的代码(我敢肯定你已经实现了它)中获得。你可能认为渲染器程序是一个对象(在面向对象的场景中),而统一变量是对象中的字段。现在,渲染器在每个顶点上调用,顶点作为aVertexPosition参数传入到渲染器的代码中,由于在drawScene函数中使用vertexPositionAttribute,此时,我们将其属性与缓冲区关联在一起。渲染器主程序中的这部分代码只是将顶点与模型视图矩阵和投影矩阵相乘,然后作为顶点最终位置的结果传出。webGLStart函数调用initShaders函数,在网页的脚本中使用getShader函数装载了片段渲染器和顶点渲染器,以便它们能被编译后传入到WebGL,最终使用WebGL渲染出三维场景。

剩下还没有说明的代码是setMatrixUniforms函数,一旦你理解了上面所讲的,就很容易理解它。

function setMatrixUniforms() {

  gl.uniformMatrix4fv(shaderProgram.pMatrixUniform, false,

      new WebGLFloatArray(pMatrix.flatten()));

  gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false,

      new WebGLFloatArray(mvMatrix.flatten()));

}

通过引用uniform来表示initShaders中的投影矩阵和模型视图矩阵,我们将值从JavaScript类型矩阵传递给了WebGL。

 

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. stm32F429i-diso USB Host 模式

    新的代码,可以连接USB SD卡读卡器 接一个8G的SD卡, 可以连接 普通的2个品牌的U盘。 代码位置:en.stm32cubef4\STM32Cube_FW_F4_V1.21.0\Projects\STM32F429I-Discovery\Demonstrations\STemWin\MDK-ARM另外一个测试: STM32Cube_FW_F4_V1.21.0\Projects\STM32F429I-Disco…...

    2024/5/1 12:18:29
  2. spring中datasource配置

    datasource配置有很多种,我介绍的一种是采用c3p0的,它的百科地址是: http://baike.baidu.com/view/920062.htm<!-- spring加载资源文件 --><bean name="propertiesConfig"class="org.springframework.beans.factory.config.PropertyPlaceholderConf…...

    2024/4/17 6:49:54
  3. 解决大量调用Python subprocess.Popen产生的一些bug

    自从工作了就好久没发博客,还是出来冒个泡=。= 前段时间写的一个项目需要用python的subprocess.Popen大量调用某shell命令,运行到一定量级之后就会产生内存溢出,造成大量线程阻塞,然后就会造成([Errno 24] Too many open files)这个异常。 网上有人说是close_fds=True这个…...

    2024/4/17 19:56:09
  4. JMeter中BeanShell实现写入文件

    1.首先F:\test.txt文件为空2.定义JMeter参数3.编写BeanShell代码public static void execParam() { String getdata = vars.get("v1"); //vars.get("v1"):意思是获取JMeter的参数值,然后将获取的值赋值给getdata变量//用以下方式也可以://String getdat…...

    2024/4/17 19:55:39
  5. STM32F429 >> 22. FMC_扩展外部SDRAM(二)

    FMC 简介 STM32F429 使用 FMC 外设来管理扩展的存储器,FMC 是 Flexible Memory Controller的缩写,译为可变存储控制器。 它可以用于驱动包括 SRAM、SDRAM、NOR FLASH 以及NAND FLSAH 类型的存储器。 在其它系列的 STM32 控制器中,只有 FSMC 控制器(Flexible Static Memory C…...

    2024/5/1 9:26:14
  6. 基于 HTML5 的 WebGL 自定义 3D 摄像头监控模型

    前言 随着视频监控联网系统的不断普及和发展, 网络摄像机更多的应用于监控系统中,尤其是高清时代的来临,更加快了网络摄像机的发展和应用。 在监控摄像机数量的不断庞大的同时,在监控系统中面临着严峻的现状问题:海量视频分散、孤立、视角不完整、位置不明确等问题,始终围…...

    2024/5/1 8:57:28
  7. python 中subprocess的Popen杀死子进程的方法

    需要首先了解shell=True和shell=False的区别和联系。https://blog.csdn.net/xiaoyaozizai017/article/details/72794469shell=True参数会让subprocess.call接受字符串类型的变量作为命令,并调用shell去执行这个字符串,当shell=False是,subprocess.call只接受数组变量作为命令…...

    2024/5/1 9:40:55
  8. EasyUI一些布局(基本介绍)以及运行结果

    一、EasyUI布局介绍easyUI布局容器包括东、西、南、北、中五个区域,其中中心面板是必须的,而东、西、南、北这四个面板是可选的,如果布局里面不需要东、西、南、北这四个面板,那么可以把相应的div删掉,另外,如果需要创建复杂的easyUI布局,那么可以通过嵌套东、西、南、北…...

    2024/4/17 19:55:15
  9. Unity5.3 转Unity 2018.4.17 WEBGL

    1、UnityStandardAssets.Characters.ThirdPerson中的脚本AICharacterControl中NavMeshAgent的错误 解决方法:增加using UnityEngine.AI;引用。 2、UnityStandardAssets.Cameras中的脚本TargetFieldOfView中ParticleRenderer错误 解决方法:注释掉//if (!((r is TrailRenderer)…...

    2024/5/1 7:10:41
  10. ARINC 429 过滤介绍

    ARINC 429 过滤介绍SDI过滤 SDI过滤为数据字第9、第10位(SDI)满足设置的SDI值时收取,不满足不收取 Label号过滤 数据字中第1到第8位数据的逆序匹配Label号数组任意一个值时收取,不满足不收取...

    2024/4/17 19:55:51
  11. jmeter beanshell使用说明

    之前有一个场景 需要用jmeter 扮演多用户,也想起多个其他用户行为。就用到了 Jmeter 的Http请求和 beanshell功能。配置的线程数是指多用户同时访问,同时也可用bean shell 现实其他用户行为,如 起多个本地线程。新建个 beanshell 类请求 如: import bsh.EvalError; import…...

    2024/4/19 9:16:49
  12. c3p0 连接池配置

    <c3p0-config> <default-config> <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 --> <property name="acquireIncrement">3</property> <!--定义在从数据库获取新连接失败后重复尝试的次数。Defaul…...

    2024/4/30 8:57:54
  13. webGL第二课

    看完论坛的第一个例子之后,论坛网址。发现该作者的系列讲解比老外讲解的好多了,虽然思路和实现方法不一样,但不失为一个入门接触webGL的好教材。还是先了解,再系统性学习。今天进行第二课的学习概述该例子介绍了如何给图形绘制颜色。原理和绘制图形是一样的。一般流程首先创…...

    2024/4/17 19:54:58
  14. 解决ElasticSearch 7.x 设置大分片的时,导入数据发生rejected 429

    使用logstash导入分片数量为100的index发生错误 [logstash.outputs.elasticsearch] retrying failed action with response code: 429 ({"type"=>"es_rejected_execution_exception", "reason"=>"rejected execution of processing …...

    2024/5/1 9:28:32
  15. Python Windows下subprocess立即关闭管道

    Windows下带UI的Python程序,如果其中使用了subprocess.Popen,那么我们可以设置shell=True来不显示command窗口,但是这样的话,使用terminate()就无法立即终止管道;如果想terminate()能达到立即终止的效果,又必须把shell=False,看起来是二选一。没关系,可以用creationfla…...

    2024/5/1 6:00:08
  16. Jmeter的beanshell应该怎么写?

    目的:JMeter的beanshell编写 问题:在某些查询场景中传参为前一个月的数据,JMeter获取N天前的日期/N天前的月份以供接口测试传参 解决方案:JMeter中beanshell编写简单的代码,没有现成的方法可以调用 其他:在beanshell中调用JMeter自带方法与其他地方无异,不进行阐述,请自…...

    2024/4/15 10:02:19
  17. 小白路程之----浅谈ES6部分语法

    一、新的变量声明let和const 新的变量声明形成新的作用域区域叫,块级作用域,即在一个{}内有let或者const声明的变量,那么这个变量就只会在这个{}内产生作用。 1、let声明的注意事项 在ES6中,告别了单一的基础变量的声明var,迎来了两个新的变量声明,拥有块级作用域的let以及…...

    2024/4/16 15:34:58
  18. BeanShell脚本接口之this引用接口类型

    更多BeanShell内容见此处 我们刚刚讨论的匿名内部类风格的语法(详情见《BeanShell脚本接口之匿名内部类》)允许我们直接创建一个特定接口类型的对象,就像我们在 Java 中使用的那样。但是 BeanShell 比它更加灵活。事实上,在你的 BeanShell 脚本中,任何“this”类型的脚本引…...

    2024/4/17 19:55:03
  19. flask-socketio中使用cmd,subprocess.Popen实时输出

    flask-socketio中使用cmd#python 3.5 try:cmd = ping www.baidu.comp = subprocess.Popen(cmd, stdin=subprocess.PIPE,stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False)while True:for line in iter(p.stdout.readline, b):a = line.decode(gbk)gevent.sleep(0)…...

    2024/4/20 11:15:05
  20. Gradle 从入门到精通

    2019独角兽企业重金招聘Python工程师标准>>> Gradle 从入门到精通 Java 构建Gradle 逐渐出现在各个开源软件中,特别是Android平台。虽然工具无对错用的好即可,但是美帝亡我之心不死,从ANT(纯手动)到MAVEN(套餐模式)再到Gradle(半自动步枪),每一次都是赤裸…...

    2024/4/13 8:42:00

最新文章

  1. 如何批量修改文件的时间属性?修改创建时间,修改时间和访问时间

    一&#xff0c;前言 在Excel中&#xff0c;修改文件的访问时间、创建时间和修改时间通常不是一个直接的功能。但是&#xff0c;我们可以通过一些间接的方法和工具来实现这一目标。请注意&#xff0c;直接修改这些时间戳可能会影响文件的完整性和安全性&#xff0c;因此在进行任…...

    2024/5/1 14:22:05
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 持续交付工具Argo CD的部署使用

    Background CI/CD&#xff08;Continuous Integration/Continuous Deployment&#xff09;是一种软件开发流程&#xff0c;旨在通过自动化和持续集成的方式提高软件交付的效率和质量。它包括持续集成&#xff08;CI&#xff09;和持续部署&#xff08;CD&#xff09;两个主要阶…...

    2024/4/30 2:34:04
  4. C# 抽象类、接口

    &#xff08;1&#xff09;、抽象类和抽象方法的定义和实现&#xff1a;abstract override abstract class Vehicle{ public abstract void Run(); } 继承抽象类并且实现抽象方法 class RaceCar : Vehicle{ public override void Run(){ } } &#xff08;2&#xff09;、接口的…...

    2024/4/30 6:49:14
  5. MATLAB 自定义中值滤波(54)

    MATLAB 自定义中值滤波(54) 一、算法介绍二、算法实现1.原理2.代码一、算法介绍 中值滤波,是一种常见的点云平滑算法,改善原始点云的数据质量问题,MATLAB自带的工具似乎不太友好,这里提供自定义实现的点云中值滤波算法,具体效果如下所示: 中值滤波前: 中值滤波后:…...

    2024/4/30 7:21:17
  6. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/29 23:16:47
  7. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/30 18:14:14
  8. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  9. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/30 18:21:48
  10. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  11. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  12. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  13. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  14. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  15. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  16. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  17. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  18. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  19. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  20. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/1 4:32:01
  21. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  22. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  23. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  24. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/30 9:43:22
  25. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57