当我在某个位置有一个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) 我一直在尝试使用方形纹理渲染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依赖.
我想做一些3D绘图来可视化一些数据.我正在使用matplotlib但是matplotlib的3D功能没有2D绘图那么强大.我发现Mayavi非常强大.甚至matplotlib也在http://matplotlib.org/mpl_toolkits/mplot3d/faq.html中推荐它
但是,我之前的大多数工作都是在Python 3中完成的,但MayaVi还不支持Python 3.
我怎么能在Python 3中绘制3D图形?
我想以编程方式确定特定的 Python 脚本是否在测试环境中运行,例如
等等。我意识到这需要一些启发,但这对我来说已经足够了。是否总是设置某些环境变量?用户名总是相同吗?ETC。
我想在其逗号中拆分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)
这涉及括号匹配,所以可能正则表达式在这里没有帮助.PyParsing有commaSeparatedList这几乎做什么,我需要的只是引用(")环境得到保护,而不是{}-delimited的.
任何提示?
我有一个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)
但不用说这真的很慢.
知道怎么改进这个吗?
鉴于两个数字r和s,我想获得的所有排列的列表n +-r和m +-s.例如(带r=3.14和s=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, …
我有两个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) 我有一个(长)数组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 似乎不是理想的,因为你必须提前指定垃圾箱.
有关如何改进上述的任何想法?