当前位置: 首页 > 知识库问答 >
问题:

视图

戚研
2023-03-14

我试图在我的引擎中实现MVP矩阵。我的模型矩阵工作正常,但是我的视图和投影矩阵不工作。以下是两者的创作:

    public void calculateProjectionMatrix() {
        final float aspect = Display.getDisplayWidth() / Display.getDisplayHeight();
        final float y_scale = (float) ((1f / Math.tan(Math.toRadians(FOV / 2f))) * aspect);
        final float x_scale = y_scale / aspect;
        final float frustum_length = FAR_PLANE - NEAR_PLANE;

        proj.identity();
        proj._m00(x_scale);
        proj._m11(y_scale);
        proj._m22(-((FAR_PLANE + NEAR_PLANE) / frustum_length));
        proj._m23(-1);
        proj._m32(-((2 * NEAR_PLANE * FAR_PLANE) / frustum_length));
        proj._m33(0);
    }

    public void calculateViewMatrix() {
        view.identity();
        view.rotate((float) Math.toRadians(rot.x), Mathf.xRot);
        view.rotate((float) Math.toRadians(rot.y), Mathf.yRot);
        view.rotate((float) Math.toRadians(rot.z), Mathf.zRot);
        view.translate(new Vector3f(pos).mul(-1));
        System.out.println(view);
    }

我试图渲染的顶点是:-0.5f,0.5f,-1.0f,-0.5f,-0.5f,-1.0f,0.5f,-0.5f,-1.0f,0.5f,0.5f,-1.0f

我在上传到着色器之前测试了视图矩阵,它是正确的。

这是我的渲染方式:

    ss.bind();
    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);
    glEnableVertexAttribArray(2);
    ss.loadViewProjection(cam);
    ss.loadModelMatrix(Mathf.transformation(new Vector3f(0, 0, 0), new Vector3f(), new Vector3f(1)));
    ss.connectTextureUnits();
    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
    glDisableVertexAttribArray(0);
    glDisableVertexAttribArray(1);
    glDisableVertexAttribArray(2);
    ss.unbind();

顶点着色器:

#version 330 core

layout(location = 0) in vec3 i_position;
layout(location = 1) in vec2 i_texCoord;
layout(location = 2) in vec3 i_normal;

out vec2 p_texCoord;

uniform mat4 u_proj;
uniform mat4 u_view;
uniform mat4 u_model;

void main() {
    gl_Position = u_proj * u_view * u_model * vec4(i_position, 1.0);
    p_texCoord = i_texCoord;
}

共有3个答案

曾鸿振
2023-03-14

所以我尝试了所有的方法,发现你不应该将统一的位置初始化为0。在扩展ShaderProgram类的类中,我有:

    private int l_TextureSampler = 0;
    private int l_ProjectionMatrix = 0;
    private int l_ViewMatrix = 0;
    private int l_ModelMatrix = 0;

将其更改为:

    private int l_TextureSampler;
    private int l_ProjectionMatrix;
    private int l_ViewMatrix;
    private int l_ModelMatrix;

为我工作。

贲宜春
2023-03-14

几何图形必须放置在“查看”视锥体中。所有在观察视锥体之外的几何图形都被裁剪为一个不“可见”的几何图形。
几何形状必须位于NEAR_PLANEFAR_PLANE之间。请注意,在透视投影NEAR_PLANEFAR_PLANE必须大于 0:

0 < NEAR_PLANE < FAR_PLANE 

请注意,在视图空间中,z 轴指向视口之外。查看对象的初始视图矩阵可以通过以下方式定义:

pos = new Vector3f(0, 0, (NEAR_PLANE + FAR_PLANE)/2f );
rot = new Vector3f(0, 0, 0);

请注意,如果到FAR_PLANE的距离很远,那么物体可能非常小,几乎看不见。在这种情况下,请更改初始值:

pos = new Vector3f(0, 0, NEAR_PLANE * 0.99f + FAR_PLANE * 0.01f );
rot = new Vector3f(0, 0, 0);
俞学
2023-03-14

虽然@RabBid76的答案通常是完全正确的,但这种情况下的实际问题是糟糕的API设计(在JOML的情况下)和没有读取所用方法的JavaDocs的结合。

特别是Matrix4f._mNN()方法仅设置相应的矩阵字段,但省略了重新评估内部存储的矩阵属性,以便在了解矩阵的属性时加速/路由进一步的矩阵运算(最显着的是乘法)到更优化的方法,例如“它是否具有恒等”,“它是否仅表示平移”,“它是否是透视投影”, “它是仿射的”,“它是正交的吗”等等...这是JOML在大多数情况下应用的优化,可以显着提高矩阵乘法的性能。

至于糟糕的API设计:这些方法只有在类<code>org.joml.internal中才是公共的。MemUtil访问它们,以设置从NIO缓冲区读取的矩阵元素。由于Java还没有朋友类,因此这些_mNN()方法必须是公共的。但是,它们不适用于公共/客户端使用。

我已经更改了这一点,下一个JOML版本1.9.21将不再公开它们。为了仍然显式地设置矩阵字段(在这里的大多数情况下不需要),仍然可以使用mNN()方法,这些方法会重新评估/削弱矩阵属性,以使所有进一步的操作仍然正确,尽管可能不是最佳的。

因此,这种情况下的问题实际上是:JOML仍然认为手动创建的透视投影矩阵是单位矩阵,并将缩短进一步的矩阵乘法。

 类似资料:
  • 英文原文:http://emberjs.com/guides/views/built-in-views/ Ember中定义了一套用于构建一些非常基础的控件的视图,比如文本输入框、勾选框和选择列表。 这些视图有: Ember.Checkbox 1 2 3 4 <label> {{view Ember.Checkbox checked=model.isDone}} {{model.title

  • 英文原文:http://emberjs.com/guides/views/defining-a-view/ 你可以使用Ember.View来渲染一个Handlebars模板并将它插入到DOM中。 为了告诉视图要用哪个模板,可以设置它的temaplateName属性。例如,如果我有一个像这样的<script>标签: 1 2 3 4 5 6 7 <html> <head> <script

  • 利用UIScrollView实现视差滚动效果。在demo中,滑动ScrollView,背景图和文字的滚动速度不一样。直接用ScrollView 的协议,对其子视图的坐标进行随机系数比例的位置移动修正,从而实现视差滚动效果。没有用其他的框架,代码简单。 作者说:原创Demo 转载请注明出处。 [Code4App.com]

  • 要创建可视化视图: 点击左侧导航栏的 Visualize 。 点击 Create new visualization 按钮或 + 按钮。 选择视图类型: 基础图形 Line, Area and Bar charts 在X/Y图中比较两个不同的序列。 Heat maps 使用矩阵的渐变单元格. Pie chart 显示每个来源的占比。 数据 Data table 显示一个组合聚合的原始数据。 Met

  • 视图是 MVC 模式中的一部分。 它是展示数据到终端用户的代码,在网页应用中, 根据视图模板来创建视图,视图模板为PHP脚本文件, 主要包含HTML代码和展示类PHP代码,通过view应用组件来管理, 该组件主要提供通用方法帮助视图构造和渲染, 简单起见,我们称视图模板或视图模板文件为视图。 创建视图 如前所述,视图为包含HTML和PHP代码的PHP脚本,如下代码为一个登录表单的视图, 可看到PH

  • 创建视图 {tip} 如果你想找到有关如何编写 Blade 模板的更多信息?查看完整的 Blade 文档 。 视图包含应用程序的 HTML,并且将控制器/应用程序逻辑与演示逻辑分开。视图文件存放于 resources/views 目录下。一个简单的视图如下所示: <!-- 此视图文件位置:resources/views/greeting.blade.php --> <body>