使用OpenGL绘制图像

2023-12-05

如何使用开放的 OpenGL/OpenTK 在地图 (GMap.Net) 上绘制视频/图像(来自无人机的视频)

我的问题是如何在地图上绘制视频图像,因为视频可以在地图上以不同角度观看,并且图像在地图上应该是梯形而不是四边形?

I copied image from other question... Currently my code bellow draw quad but in quad I see 2 triangles which are not equal. enter image description here enter image description here

当前代码:

public override void OnRender()
{
    if (!backgroundColor.HasValue)
        backgroundColor = new Pen(Fill).Color;
    GL.Color4(backgroundColor.Value);

    lock (bitmapSync)
    {
        if (bitmap != null)
            createTexture();
    }

    GL.Enable(EnableCap.Texture2D);
    GL.BindTexture(TextureTarget.Texture2D, texture);

    GL.Begin(PrimitiveType.Quads);
    {
        //TODO this works fine only for correct square image and not for trapezoid 
        GL.TexCoord2(0, 0); GL.Vertex2(LocalPoints[0].X, LocalPoints[0].Y);
        GL.TexCoord2(1, 0); GL.Vertex2(LocalPoints[1].X, LocalPoints[1].Y);
        GL.TexCoord2(1, 1); GL.Vertex2(LocalPoints[2].X, LocalPoints[2].Y);
        GL.TexCoord2(0, 1); GL.Vertex2(LocalPoints[3].X, LocalPoints[3].Y);
    }
    GL.End();
    GL.Disable(EnableCap.Texture2D);

    float wid = Stroke.Width;
    Color col = Stroke.Color;

    if (wid > 0)
    {
        for (int i = 0; i < LocalPoints.Count; i++)
        {
            int j = (i + 1) % LocalPoints.Count;
            GMapControl.line(LocalPoints[i].X, LocalPoints[i].Y, LocalPoints[j].X, LocalPoints[j].Y, wid, col);
        }
    }
}

答案在OpenGL ES 2.0 中梯形的透视正确纹理 http://www.reedbeta.com/blog/quadrilateral-interpolation-part-1/ https://gamedev.stackexchange.com/questions/68021/how-can-i-draw-a-perspective- Correct-quad 如何在openGL中纹理随机凸四边形没有帮助...


我找到了四边形透视校正的解决方案

public override void OnRender()
{
    if (LocalPoints.Count == 4 && !targetPosition.IsEmpty)
    {
        if (!backgroundColor.HasValue)
            backgroundColor = new Pen(Fill).Color;
        GL.Color4(backgroundColor.Value);

        lock (bitmapSync)
        {
            if (bitmap != null)
                createTexture();
        }

        GL.Enable(EnableCap.Texture2D);
        GL.BindTexture(TextureTarget.Texture2D, texture);

        // center point
        GPoint localTargetPosition = MainForm.instance.gMapControl.FromLatLngToLocalWithOffset(targetPosition);
        // determines distances to center for all vertexes
        double dUL = Common.distance(new double[] { LocalPoints[0].X, LocalPoints[0].Y }, new double[] { localTargetPosition.X, localTargetPosition.Y });
        double dUR = Common.distance(new double[] { LocalPoints[1].X, LocalPoints[1].Y }, new double[] { localTargetPosition.X, localTargetPosition.Y });
        double dLR = Common.distance(new double[] { LocalPoints[2].X, LocalPoints[2].Y }, new double[] { localTargetPosition.X, localTargetPosition.Y });
        double dLL = Common.distance(new double[] { LocalPoints[3].X, LocalPoints[3].Y }, new double[] { localTargetPosition.X, localTargetPosition.Y });

        var texCoords = new[]
        {
            new Vector4(0, 0, 1, 1),
            new Vector4(1, 0, 1, 1),
            new Vector4(1, 1, 1, 1),
            new Vector4(0, 1, 1, 1)
        };

        texCoords[0] *= (float)((dUL + dLR) / dLR);
        texCoords[1] *= (float)((dUR + dLL) / dLL);
        texCoords[2] *= (float)((dLR + dUL) / dUL);
        texCoords[3] *= (float)((dLL + dUR) / dUR);

        GL.Begin(PrimitiveType.Quads);
        {
            //GL.TexCoord2(0, 0); //UL  LocalPoints[0] gimbalUL
            //GL.TexCoord2(1, 0); //UR  LocalPoints[1] gimbalUR
            //GL.TexCoord2(1, 1); //LR  LocalPoints[2] gimbalLR
            //GL.TexCoord2(0, 1); //LL  LocalPoints[3] gimbalLL
            GL.TexCoord4(texCoords[0]); GL.Vertex4(LocalPoints[0].X, LocalPoints[0].Y, 1, 1);
            GL.TexCoord4(texCoords[1]); GL.Vertex4(LocalPoints[1].X, LocalPoints[1].Y, 1, 1);
            GL.TexCoord4(texCoords[2]); GL.Vertex4(LocalPoints[2].X, LocalPoints[2].Y, 1, 1);
            GL.TexCoord4(texCoords[3]); GL.Vertex4(LocalPoints[3].X, LocalPoints[3].Y, 1, 1);
        }

        GL.End();
        GL.Disable(EnableCap.Texture2D);

        float wid = Stroke.Width;
        Color col = Stroke.Color;

        if (wid > 0)
        {
            for (int i = 0; i < LocalPoints.Count; i++)
            {
                int j = (i + 1) % LocalPoints.Count;
                GMapControl.line(LocalPoints[i].X, LocalPoints[i].Y, LocalPoints[j].X, LocalPoints[j].Y, wid, col);
            }
        }
    }
    else
    {
        base.OnRender();
    }

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

使用OpenGL绘制图像 的相关文章

  • 从实体获取单列

    如何从查询中获取单个列而不是整个对象 我可以这样做来获取整个对象 但我想要的只是名称 IList
  • 从 Invoke 方法获取 RETURN

    我正在尝试从另一个线程上的列表框项目中读取值 我尝试创建一种新方法来运行调用命令 我可以设法将命令发送到列表框 例如通过调用方法添加 但我似乎无法得到响应 我似乎无法获取该项目的值 我尝试了几种方法 一旦我将它从空变为字符串 事情就开始变得
  • 通过另一个列表更新列表(linq)

    我有类 Data 的对象列表 如下所示 class Data int code string name DateTime date update 我还有另一个课程列表 例如 class RefCodes int old code int n
  • EventHandler 应该始终用于事件吗?

    我一直在愉快地使用自定义委托类型和通用编写事件Action委托类型 没有真正考虑我在做什么 我有一些很好的扩展助手Action and EventHandler这使我倾向于使用那些预定义的委托类型而不是我自己的委托类型 但除此之外 除了惯例
  • 通过 SOAP 的 Gmt php 或 UTC C# 等效项

    is C DateTime UtcNow和 PHPdate c 是等价的 我怀疑 因为当我肥皂时 我得到了 C
  • OpenGL缓冲区更新[重复]

    这个问题在这里已经有答案了 目前我正在编写一个模拟水的程序 以下是我所做的步骤 创建水面 平面 创建VAO 创建顶点缓冲区对象 在其中存储法线和顶点 将指针绑定到此 VBO 创建索引缓冲区对象 然后我使用 glDrawElements 渲染
  • 具有多个谓词的 C++11 算法

    功能如std find if来自algorithmheader 确实很有用 但对我来说 一个严重的限制是我只能为每次调用使用 1 个谓词count if 例如给定一个像这样的容器std vector我想同时应用相同的迭代find if 多个
  • 在 Mac OS X 上安装 libxml2 时出现问题

    我正在尝试在我的 Mac 操作系统 10 6 4 上安装 libxml2 我实际上正在尝试在 Python 中运行 Scrapy 脚本 这需要我安装 Twisted Zope 现在还需要安装 libxml2 我已经下载了最新版本 2 7 7
  • MSMQ接收和删除

    是否有任何选项可以在读取消息后将其从 MSMQ 中删除 比如 接收 删除可以作为原子操作运行吗 听起来您想查看下一条消息 然后在处理完成后接收它 Message message Queue Peek Queue ReceiveById me
  • Opengl 像素完美 2D 绘图

    我正在研究 2d 引擎 它已经工作得很好 但我不断收到像素错误 例如 我的窗口是 960x540 像素 我从 0 0 到 959 0 画一条线 我希望扫描线 0 上的每个像素都会被设置为一种颜色 但事实并非如此 最右边的像素没有被绘制 当我
  • C# Winforms Designer 无法打开,因为它无法在同一程序集中找到类型

    我收到以下错误 找不到类型 My Special UserControl 请确保引用包含此类型的程序集 如果此类型是您的开发项目的一部分 请确保已使用当前平台或任何 CPU 的设置成功构建该项目 但没有任何意义的是My Special Us
  • 判断串口是普通COM还是SPP

    我正在寻找一种方法来确定 COM 是标准 COM 还是 SPP COM 也称为 COM 设备的电缆替换蓝牙适配器 我有一个可以在 USB COM gt USB 和蓝牙下工作的设备 并且蓝牙接口可以与 SPP 一起工作 我目前正在使用Syst
  • 提升mapped_file_source、对齐方式和页面大小

    我正在尝试在性能很重要的上下文中解析一些大小高达几百兆字节的文本文件 因此我使用 boostmapped file source 解析器期望源以空字节终止 因此我想检查文件大小是否是页面大小的精确倍数 如果是 则使用较慢的非内存映射方法 我
  • 如何设置消息队列的所有者?

    System Messaging MessageQueue 类不提供设置队列所有权的方法 如何以编程方式设置 MSMQ 消息队列的所有者 简短的答案是 p invoke 对 windows api 函数的调用MQSetQueueSecuri
  • 如何在 EF Core 2.1 中定义外键关系

    我的 DAL 使用 EF Core 2 1 这就是我的模型的样子 一名用户只能拥有一种角色 Role entity kind of master public class Role public int RoleId get set pub
  • 测验;这个编译了吗?如果是的话它会返回什么(我知道答案)

    我最近发现这个错字 if name find string npos 显然开发者的意思是输入 if name find string npos 但令我惊讶的是发现错误甚至编译 Wall Werror 没有尝试过 pedantic 那么 咖啡
  • 在 Qt 中播放通知(频率 x)声音 - 最简单的方法?

    Qt 5 1 或更高版本 我需要播放频率为 x 的通知声音 n 毫秒 如果我能像这样组合音调那就太好了 1000Hz 持续 2 秒 然后 3000Hz 持续 1 秒 最简单的方法是使用文件 WAV MP3 例如如此处所述 如何用Qt播放声音
  • 用数组或向量实现多维数组

    我想使用单个数组或向量实现多维数组 可以像通常的多维数组一样访问它 例如 a 1 2 3 我陷入困境的是如何实施 操作员 如果数组的维数为 1 则 a 1 应该返回位于索引 1 处的元素 但是如果维数大于一怎么办 对于嵌套向量 例如 3 维
  • 对多个对象使用事件处理程序

    我有 20 件物品List
  • 如何知道 HTTP 请求标头值是否存在

    我确信这很简单 但是却让我感到厌烦 我在 Web 应用程序中使用了一个组件 它在 Web 请求期间通过添加标头 XYZComponent true 来标识自身 我遇到的问题是 如何在视图中检查此组件 以下内容不起作用 if Request

随机推荐

  • 使用 PHP 从 SQL Server 选择数据

    我正在尝试使用 PHP 从我的 PC 上的本地数据库中选择数据 但当我运行 127 0 0 1 test php 该文件的名称 时 出现此错误 error Fatal error Uncaught Error Call to undefin
  • 如何在 ASP.Net MVC 视图中使用下划线/javascript 模板

    我只是想知道如何在 aspx 视图中使用下划线模板 因为下划线使用的 标记被 aspx 渲染引擎拾取并给我错误 例如 该模板给了我一个错误 因为 aspx 渲染引擎认为我正在尝试将这些东西绑定到模型 Thanks 来自精美手册 templa
  • iOS 上的 iframe 大小与 CSS

    有一个 iframe 它的内容基本上超出了框架的容纳范围 框架的大小基于浏览器屏幕大小 并让溢出滚动 这在除 iOS 之外的所有浏览器上都能完美运行 在 iOS 上 safari 决定调整框架大小以适应内容 不是你所期望的 jsFiddle
  • Azure Key Vault 证书 - 创建基本约束 CA:True

    我想通过 Azure 门户 Azure Key Vault 创建自签名 CA 证书 我不知道如何设置 X509 扩展基本约束 CA True 一些参考链接 https learn microsoft com en us powershell
  • 匹配以前缀开头的子字符串

    我被一些正则表达式困住了 我试图使用正则表达式匹配以给定前缀开头的每个子字符串 在 JavaScript 中 prefix pre regex pre foo bar bar pre bar barfoo replace regex sho
  • 如何从 Android 调用 RESTful Web 服务?

    我使用 Jersey Framework 和 Java 在 Netbean IDE 中编写了一个 REST Web 服务 对于用户需要提供用户名和密码的每个请求 我知道这种身份验证不是最佳实践 使用如下的curl命令 curl u user
  • Mongodb身份验证[重复]

    这个问题在这里已经有答案了 如何通过官方 C 驱动程序使用 mongodb 进行身份验证 除了内部成员之外 我找不到任何用于身份验证的 API 方法 应使用以下连接字符串格式在连接字符串中指定身份验证凭据 mongodb username
  • ChartJS 3 不显示图例

    我正在使用 ChartJS 3 7 即使我通过了options plugins legend display a true 图例不显示 如何让图例显示 看起来较新版本的 ChartJS 要求您注册要使用的各个元素 您需要专门注册图例 imp
  • 使用 Google 登录的 OAuth2 Spring 安全性不起作用

    我在下面的链接中找到了一个关于使用 Spring security 进行第三方登录的非常好的教程 它包含前端和后端代码 https www callicoder com spring boot security oauth2 social
  • 使用多个数据库运行 Laravel 队列

    我有 Laravel 5 项目 这是多租户项目 因此我有一个包含多个数据库的文件夹项目 当我使用php artisan queue listen 它仅适用于当前的数据库设置 我用database队列驱动程序 因此每个租户都有自己的通知表 如
  • 纠正缺少 ASP.Net MVC 控制器的 404 消息

    我有一个 MVC 2 应用程序 它应该始终提供 漂亮 的 404 页面 然而目前我得到了一个低级别的 Net sitename 应用程序中的服务器错误 我有一个基本控制器 它有一个NotFound将呈现漂亮的 404 页面的操作 处理缺失的
  • 如何使用 Selenium 为 Firefox 和 Chrome 禁用推送通知?

    我想在通过 Selenium Webdriver 启动 Firefox 浏览器时禁用通知 我发现这个答案 但它已被弃用 并且在 Firefox 上对我不起作用 但它在 Chrome 上完美工作 我将这种依赖关系用于我的pom xml
  • ORA-22275: 指定的 LOB 定位器无效

    我有一个巨大的 Oracle 函数 用于计算 6 个表中的数据 create or replace FUNCTION STATISTICS FUNCTION NAMEIN IN VARCHAR2 RETURN CLOB AS LAST 60
  • 从标准库中重新定义函数是否违反了单一定义规则?

    include
  • 如何使用razor自定义EditorFor CSS

    我有这门课 public class Contact public int Id get set public string ContaSurname get set public string ContaFirstname get set
  • Xcode 8 为 iOS 10 生成损坏的 NSManagedObject 子类

    我最近将我的 iOS 应用程序项目更新到了 iOS 10 现在我尝试更改应用程序的核心数据模型 但 Xcode 生成的新 NSManagedObject 子类已损坏 我还尝试修复子类手册 但这不起作用 核心数据模型的最低工具版本设置为 Xc
  • 使用 React 定期重新加载 iframe 的最佳方法是什么?

    我正在使用 React 构建一个网页 这意味着我无法直接操作 DOM 我尝试通过更新 url 状态来重新加载 iframe 但这似乎不会重新加载页面 这是我尝试过的状态代码 componentDidMount function setInt
  • 在主选项卡栏控制器之前显示登录视图控制器

    我正在创建一个带有需要登录的标签栏控制器的 iPad 应用程序 因此 在启动时 我想显示一个 LoginViewController 如果登录成功 则显示选项卡栏控制器 这就是我实现初始测试版本的方式 省略了一些典型的标头内容等 AppDe
  • Eclipse 编辑器中当前选定代码的 AST?

    我需要在 Eclipse 的 java 编辑器中获取当前选择的 AST 基本上我想将选定的java代码转换为其他形式 可能是其他语言或XML等 所以我想 我需要获得 AST 来进行选择 目前我能够以简单文本的形式进行选择 对于这样的问题有什
  • 使用OpenGL绘制图像

    如何使用开放的 OpenGL OpenTK 在地图 GMap Net 上绘制视频 图像 来自无人机的视频 我的问题是如何在地图上绘制视频图像 因为视频可以在地图上以不同角度观看 并且图像在地图上应该是梯形而不是四边形 I copied im