小编Nic*_*mer的帖子

C++/openGL:使用四元数将QUAD旋转到一个点

当我在某个位置有一个QUAD时,我怎么能以这样的方式旋转它以使其法线指向一个给定的点?想象一下,彩色块只是矩形四边形,然后这个图像显示了我的意思.四边形都以这样的方式定向,它们指向球体的中心.

alt text http://emrahgunduz.com/wp-content/uploads/2009/01/material_id_gui-600x364.jpg

也许这第二张图片显示了我正在尝试的更多内容: alt text http://img689.imageshack.us/img689/3130/screenshot20100708at555.png

我正在使用openGL/C++(以及Eigen lib).我有这个代码来绘制一个简单的四边形:

#include "ofMain.h"
#include "Quad.h"
Quad::Quad(Vector3f oPosition):position(oPosition) {
}

void Quad::update() {
}

void Quad::draw() {
    float size = 1.3;
    glColor3f(1.0f, 0.0f, 0.6f);
    glPushMatrix();
        glTranslatef(position.x(), position.y(), position.z());
        glScalef(size, size,size);
        glBegin(GL_QUADS);
            glVertex3f(0,0,0);
            glVertex3f(1,0,0);
            glVertex3f(1,1,0);
            glVertex3f(0,1,0);
        glEnd();
    glPopMatrix();
}
Run Code Online (Sandbox Code Playgroud)

更新17-07 亲爱的读者,

旋转四边形进一步了解一下.我随机定位了几个四边形,然后look_at使用此代码使用以下回复中的描述将它们旋转到vector3f:

void Quad::draw() {
    float size = 0.5;
    glColor3f(1.0f, 0.0f, 0.6f);
    glPushMatrix();
        Vector3f center = look_at - position;
        Vector3f center_norm = center.normalized();
        float r_angle   = acos(center_norm.dot(normal));
        Vector3f axis = normal.normalized().cross(center_norm); …
Run Code Online (Sandbox Code Playgroud)

c++ opengl rotation quaternions

10
推荐指数
1
解决办法
2301
查看次数

纹理在OpenGL中映射具有方形纹理的梯形

我一直在尝试使用方形纹理渲染GL_QUAD(形状为梯形).我想尝试使用OpenGL来解决这个问题.现在纹理变得严重扭曲,这真的很烦人.

通常情况下,我会加载纹理计算单应性,但这意味着大量的工作和额外的线性编程库/直接线性变换函数.我的印象是OpenGL可以为我简化这个过程.

我环顾网络,看过"透视 - 正确纹理,Q坐标和GLSL""OpenGL中的倾斜/剪切纹理映射".

这些似乎都假设你会做某种类型的单应性计算或使用OpenGL的某些部分我不知道......任何建议?

更新:

我一直在阅读"使用图像空间简化和变形导航静态环境" [ PDF ] - 第9页附录A.

看起来他们通过将(s,t,r,q)纹理坐标与模型的世界空间z分量的顶点相乘来禁用透视校正.

因此对于给定形状为梯形的四边形的给定纹理坐标(s,r,t,q),其中4个分量是:

(0.0f, 0.0f, 0.0f, 1.0f),
(0.0f, 1.0f, 0.0f, 1.0f),
(1.0f, 1.0f, 0.0f, 1.0f),
(1.0f, 0.0f, 0.0f, 1.0f) 
Run Code Online (Sandbox Code Playgroud)

这和glTexCoord4f(s vert.z,r vert.z,t,q*vert.z)一样简单吗?或者我错过了一些步骤?喜欢弄乱GL_TEXTURE glMatrixMode?

更新#2:

这就是诀窍!记住这一点,这个问题遍布整个网络,并没有任何简单的答案.大多数涉及直接重新计算纹理与原始形状和变换形状之间的单应性...也就是大量的线性代数和外部BLAS lib依赖.

opengl texture-mapping

10
推荐指数
1
解决办法
5307
查看次数

除了几个方法之外,从模块导入所有内容

除了一些明确指定的方法之外,是否可以从现有的Python模块中获取importeverything(*)?

(背景:针对Python的推荐做法是在普通FENICSfrom dolfin import *几个名称中包含字符串"Test"虽然(例如,方法.TestFunction())和被误认为是单元测试的鼻子.)

python import

10
推荐指数
2
解决办法
4762
查看次数

在Python 3中绘制3D图形

我想做一些3D绘图来可视化一些数据.我正在使用matplotlib但是matplotlib的3D功能没有2D绘图那么强大.我发现Mayavi非常强大.甚至matplotlib也在http://matplotlib.org/mpl_toolkits/mplot3d/faq.html中推荐它

但是,我之前的大多数工作都是在Python 3中完成的,但MayaVi还不支持Python 3.

我怎么能在Python 3中绘制3D图形?

python matplotlib python-3.x mayavi

10
推荐指数
1
解决办法
3587
查看次数

检查我们是否处于 GitHub Action / Travis CI / Circle CI 等测试环境中

我想以编程方式确定特定的 Python 脚本是否在测试环境中运行,例如

  • GitHub 行动
  • 特拉维斯·西尔
  • 圆CI

等等。我意识到这需要一些启发,但这对我来说已经足够了。是否总是设置某些环境变量?用户名总是相同吗?ETC。

python travis-ci circleci github-actions cicd

10
推荐指数
2
解决办法
3274
查看次数

以逗号分割字符串,但在括号环境中除外

我想在其逗号中拆分Python多行字符串,除非逗号位于括号内的表达式中.例如,字符串

{J. Doe, R. Starr}, {Lorem
{i}psum dolor }, Dol. sit., am. et.
Run Code Online (Sandbox Code Playgroud)

应该拆分成

['{J. Doe, R. Starr}', '{Lorem\n{i}psum dolor }', 'Dol. sit.', 'am. et.']
Run Code Online (Sandbox Code Playgroud)

这涉及括号匹配,所以可能正则表达式在这里没有帮助.PyParsingcommaSeparatedList几乎做什么,我需要的只是引用(")环境得到保护,而不是{}-delimited的.

任何提示?

python regex parsing pyparsing

9
推荐指数
2
解决办法
3749
查看次数

为numpy数组的每个"其他"字段((i + j)%2 == 0)添加值

我有一个m-by- nnumpy的数组,我想补充1.0的所有条目[i, j]的时候(i + j) % 2 == 0,即"每平方等".

我当然可以简单地遍历字段

import numpy as np

a = np.random.rand(5, 4)

for i in range(a.shape[0]):
    for j in range(a.shape[1]):
        if (i + j) % 2 == 0:
            a[i, j] += 1.0
Run Code Online (Sandbox Code Playgroud)

但不用说这真的很慢.

知道怎么改进这个吗?

python arrays numpy matrix

9
推荐指数
2
解决办法
232
查看次数

+ -r,+ -s的所有排列

鉴于两个数字rs,我想获得的所有排列的列表n +-rm +-s.例如(带r=3.14s=2.71),

n = 1
m = 1
out = [
    (+r, +s), (+r, -s), (-r, +s), (-r, -s), 
    (+s, +r), (+s, -r), (-s, +r), (-s, -r)
    ]
Run Code Online (Sandbox Code Playgroud)
n = 1
m = 2
out = [
    (+r, +s, +s), (+r, -s, +s), (-r, +s, +s), (-r, -s, +s), ...
    (+s, +r, +s), (-s, +r, +s), (+s, -r, +s), (-s, -r, +s), ...
    ...
    ]
Run Code Online (Sandbox Code Playgroud)

随着itertools.product([+r, …

python combinatorics python-itertools

9
推荐指数
2
解决办法
717
查看次数

用x计算x**k,k是任意维度的数组

我有两个numpy数组:一个x有形状的(n, a0, a1, ...)数组和一个k有形状的数组(n, b0, b1, ...).我想计算和指数数组,使输出具有维度(a0, a1, ..., b0, b1, ...)

out[i0, i1, ..., j0, j1, ...] == prod(x[:, i0, i1, ...] ** k[:, j0, j1, ...])
Run Code Online (Sandbox Code Playgroud)

如果只有一个a_i和一个b_j,广播通过

import numpy

x = numpy.random.rand(2, 31)
k = numpy.random.randint(1, 10, size=(2, 101))

out = numpy.prod(x[..., None]**k[:, None], axis=0)
Run Code Online (Sandbox Code Playgroud)

如果x有更多维度,None则必须添加更多s:

x = numpy.random.rand(2, 31, 32, 33)
k = numpy.random.randint(1, 10, size=(2, 101))

out = …
Run Code Online (Sandbox Code Playgroud)

python arrays numpy

9
推荐指数
1
解决办法
187
查看次数

从整数列表创建索引字典

我有一个(长)数组a的一些不同的整数.我现在想创建一个字典,其中键是整数,值是索引数组,其中a出现相应的整数.这个

import numpy

a = numpy.array([1, 1, 5, 5, 1])
u = numpy.unique(a)
d = {val: numpy.where(a==val)[0] for val in u}

print(d)
Run Code Online (Sandbox Code Playgroud)
{1: array([0, 1, 4]), 5: array([2, 3])}
Run Code Online (Sandbox Code Playgroud)

工作正常,但第一次打电话似乎相当浪费unique,接下来是几个where.

np.digitize 似乎不是理想的,因为你必须提前指定垃圾箱.

有关如何改进上述的任何想法?

python numpy

9
推荐指数
1
解决办法
758
查看次数