WebGL等角投影

2023-12-10

好吧——这里要疯了。我正在做一些 WebGL,我正在尝试制作一个等距立方体。我不想使用 Three.js。我想首先了解我的代码出了什么问题。我一直在研究,我能找到的唯一教程似乎是针对 OpenGL 的

无论如何 - 这是我的drawScene函数:

function drawScene() {

this.gl.clear(this.gl.COLOR_BUFFER_BIT | this.gl.DEPTH_BUFFER_BIT);
mat4.perspective(45, this.gl.viewportWidth / this.gl.viewportHeight, 0.1, 100.0, pMatrix);
mvMatrix = mat4.lookAt([0,0,40], [0, 0, 0], [0, 1, 0]);

_globalNext = this._first;

    while(_globalNext) {
    _globalNext.render();
    }

}

渲染函数是

function render() {

mvPushMatrix();

//transform. order matters.
mat4.translate(mvMatrix, [this._x, this._y, this._z]);
mat4.rotate(mvMatrix, 0.01745*this._rot, [this._axisX, this._axisY, this._axisZ]);
mat4.scale(mvMatrix,  [this._scaleX,this._scaleY,this._scaleZ]);

//bind the buffers.
this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this._positionBuff);
this.gl.vertexAttribPointer(this._shader.vertexPositionAttribute, this._positionBuff.itemSize,   this.gl.FLOAT, false, 0, 0);

this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this._colorBuff);
this.gl.vertexAttribPointer(this._shader.vertexColorAttribute, this._colorBuff.itemSize, this.gl.FLOAT, false, 0, 0);

this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this._indexBuff);
this.setMatrixUniforms(this.gl);
this.gl.drawElements(this.gl.TRIANGLES, this._indexBuff.numItems, this.gl.UNSIGNED_SHORT, 0);

    if(this._usePopper == false) {
    mvPopMatrix();
    } 

_globalNext = this._nextSib;
}

相当行人。我用它来绘制立方体。无论如何,在 OpenGL 示例中,他们似乎取消了透视功能,但在这里,如果我省略它,我的场景将是空白的。我知道lookAt函数工作正常,我必须这样做某物与透视矩阵。如果有一点帮助,我们将不胜感激。谢谢你!


投影矩阵所做的就是将场景的坐标系映射到 X 和 Y 轴上的 [-1, 1] 范围,这是将片段渲染到窗口时使用的空间。可以以直接渲染到 [-1, 1] 空间的方式构建场景,在这种情况下不需要投影矩阵(这可能是您在示例中提到的省略它的内容,但是通常情况并非如此。

当使用透视矩阵作为投影矩阵时,X 和 Y 坐标将按 Z 值缩放,从而赋予它们深度的外观。如果这种效果不理想,您可以使用正交矩阵来消除深度缩放,如下所示:

mat4.ortho(left, right, bottom, top, 0.1, 100.0, pMatrix);

左/右/上/下由您决定,但通常这些会以某种方式与您的 WebGL 视口的尺寸相对应。例如,如果您的 WebGL 窗口是 640x480,您可以执行以下操作:

mat4.ortho(0, 640, 0, 480, 0.1, 100.0, pMatrix);

这将导致放置在 (0, 0) 处的任何顶点渲染在窗口的左下角,而放置在 (648, 480) 处的任何顶点渲染在右上角。这些顶点的 z 分量不会产生任何影响。这是一种流行的技术,用于渲染 GUI 元素、精灵或等距图形,就像您尝试做的那样。

希望有帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WebGL等角投影 的相关文章

随机推荐

  • 通过消除空值来合并 Apache Spark 中的行

    我有一个像下面这样的 Spark 数据框 id 1 2 3 sf 1 sf 2 sf 3 2 null null null 102 202 302 4 null null null 104 204 304 1 null null null
  • numpy 索引:尾随省略号不应该是多余的吗?

    在尝试正确理解 numpy 索引规则时 我偶然发现了以下内容 我曾经认为索引中的尾随省略号没有任何作用 是不是很琐碎 但事实并非如此 Python 3 5 2 default Nov 11 2016 04 18 53 GCC 4 8 5 o
  • 如何手动构建 AVDepthData

    我想构建自己的深度图并保存带有深度信息的图像 例如肖像照片 所以首先我需要生成 AVDepthData 在挖掘了它的构建方式之后 我尝试重现它 func buildDepth let info AnyHashable Any kCGImag
  • 如何访问 xsl:output 属性中的 xsl:param?

    我想允许转换器在样式表中设置一个参数来指定需要多少个缩进空间 我已经尝试了 Dimitre Novatev 在答案中的所有建议here无济于事
  • ThisWorkbook 运行时错误 438

    我有一个 VBA 将唯一值从 Sheet1 复制并粘贴到 Sheet3 上 但是 当我运行 VBA 时 出现运行时错误 438 我的 VBA 看起来像这样 Sub UniqueList Application ScreenUpdating
  • Spring Kafka 中的 Kafka 消费者/生产者测试

    我目前正在研究我正在使用的 Kafka 模块spring kafka卡夫卡通信的抽象 我能够从实际实现的角度集成生产者和消费者 但是 我不确定如何测试 特别是集成测试 消费者周围的业务逻辑 KafkaListener 我试着跟随spring
  • 在 PyCharm 上导入 NLTK 时出错

    我试图在 PyCharm 中导入 NLTK 并收到以下错误 我使用的是 Mac OS 10 5 8 和 Python 2 7 6 可能发生什么事 我对编程完全陌生 如果我缺少一些基本的东西 我很抱歉 安装软件包失败 安装软件包 nltk 时
  • 在 R 包中包含 Shiny 应用程序:传输输入参数

    我正在尝试将 Shiny 应用程序作为 R 包的一部分运行 我按照 Dean Attali 网站上列出的说明进行操作 https deanattali com 2015 04 21 r package shiny app 如该网站所示 我在
  • postgresql 中的字符串文字和转义字符

    尝试将转义字符插入表中会导致警告 例如 create table EscapeTest text varchar 50 insert into EscapeTest text values This is the first part n
  • Firebase Storage getDownloadURL 背后的目的是什么

    根据这些docs 我明白一旦我们在存储中拥有了 firebase 路径 我们就可以通过调用来获取下载网址getDownloadUrl 在这条路径上的ref 我的问题是所有文档都建议首先获取下载网址 然后根据这些图像下载文件数据 但是我们可以
  • Ionic 找不到模块“../providers/auth-service/auth-service”

    我正在尝试在 ionic Angular 3 3 0 中创建登录 注册 我收到错误无法找到模块 providers auth service auth service 在login ts 文件中 请帮忙 auth service ts im
  • 选择具有给定 id 的元素的更快方法

    我有个问题 假设我们有以下 html 标签 div I am a div div 他的div存在于dom上 它不是由javascript生成的 如果我想在 javascript 中多次使用这个 div 哪种方法更好 将其存储在如下变量中 v
  • 在 R 中哪些包可以快速加载更大的数据

    在 R 中 数据通常加载到 RAM 中 是否有任何软件包可以将数据加载到磁盘而不是 RAM 中 查看bigmemory包 以及相关包 例如bigtabulate bigalgebra biganalytics 和更多 还有ff 尽管我发现它
  • 如何沿列迭代向下相乘?

    我在这件事上遇到了困难 不知道为什么 也许现在已经很晚了 我在 pandas 中有一个数据框 如下所示 1 10 2 11 3 20 4 5 5 10 我想计算每一行上面每一行的被乘数 例如 在第 3 行 我想计算 10 11 20 即 2
  • 如何使用 Selenium WebDriver 和 Java 查找损坏的链接

    我想验证网站上的损坏链接 并且我正在使用以下代码 public static int invalidLink String currentLink String temp public static void main String arg
  • 如何禁用文本选择突出显示

    对于作用类似于按钮的锚点 例如 此 Stack Overflow 页面侧边栏上标题为问题 Tags and Users 或选项卡 是否有 CSS 标准方法可以在用户意外选择文本时禁用突出显示效果 我意识到这可以用 JavaScript 来完
  • 如何使用 C# 从另一个表单按下按钮?

    我有两种形式 Form1 进行屏幕截图 Form2 有 2 个按钮来操作 form1 创建的屏幕截图 Form1 还有一个 隐藏 按钮 其中包含保存屏幕截图的方法 我的问题 如何从form2中单击form1的按钮 和 如何检查 form1
  • 如何编写正则表达式来仅匹配数字、字母和破折号?

    我需要一个只接受以下内容的表达式 数字 普通字母 无特殊字符 空格也是不允许的 例子 正则表达式应该匹配 this is quite alright 不应该匹配 this is not so lright 您可以使用 A Za z0 9 这
  • Excel - 将一个范围内的数据匹配到另一个范围内,并从匹配数据右侧的单元格中获取值

    我不太擅长 Excel 公式 我正在尝试弄清楚如何首先检查列中是否存在单元格值 如果存在 则获取下一个单元格的值 具体来说 我有一系列细胞 从 B31 到 B39 我想要做的是查看这些值是否出现在单元格 F3 到 F12 中 如果出现 则将
  • WebGL等角投影

    好吧 这里要疯了 我正在做一些 WebGL 我正在尝试制作一个等距立方体 我不想使用 Three js 我想首先了解我的代码出了什么问题 我一直在研究 我能找到的唯一教程似乎是针对 OpenGL 的 无论如何 这是我的drawScene函数