我正在为CNC铣床实现驱动程序,而我在实现G代码弧命令时遇到了麻烦.
我已经找到了几个中点圆算法的实现,但它实际上并不是真的可用.
我发现中点圆算法的问题在于它是2D并且同时绘制所有八分圆,而我需要通过3D路径的连续步骤,由起点,终点和中心点给出.
我发现了一个很好的多维等效Bresenham的线绘算法使用浮点运算.绘制圆弧可能存在类似的事情吗?
我可以通过大量的思考和实验来改变这种算法,但是由于绘制弧线并不是一个未解决的问题,而且之前已经制造过数控机床,我想知道是否已经存在一个优雅的解决方案?
在适用于Android的OpenGL ES 1中,我有一个Rubic多维数据集,其中包含27个较小的多维数据集。我想要旋转,使特定的小立方体正好位于视点的前面。所以我需要两个向量 一个是从对象原点到特定立方体的向量。另一个是从原点到视点的向量。然后它们的叉积给我旋转轴,点积给我角度。
我将(0,0,1)(这是从原点到世界坐标中的视点的向量)转换为对象坐标。这是代码:
matrixGrabber.getCurrentModelView(gl);
temporaryMatrix.set(matrixGrabber.mModelView);
inputVector[0] = 0f;
inputVector[1] = 0f;
inputVector[2] = 1f;
inputVector[3] = 1f;
Matrix.multiplyMV(resultVector, 0, temporaryMatrix.InvertMatrix(), 0, inputVector,0);
resultVector[0]/=resultVector[3];
resultVector[1]/=resultVector[3];
resultVector[2]/=resultVector[3];
inputVector = ..... // appropriate vector due to user-selection
axis = Vector.normalized(Vector.crossProduct(Vector.normalized(inputVector), Vector.normalized(resultVector)));
degree = (float)Math.toDegrees(Math.acos(Vector.dot(Vector.normalized(inputVector), Vector.normalized(resultVector))));
Run Code Online (Sandbox Code Playgroud)
我使用两个四元数进行旋转。每次用户选择一个动作时,都会发生一种轮换。这是代码:
Quaternion currentRotation = new Quaternion();
Quaternion temporaryRotation = new Quaternion();
.
.
.
currentRotation = (currentRotation).mulLeft(temporaryRotation.set(axis, degree));
currentRotation.toMatrix(matrix);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glMultMatrixf(matrix, 0);
Run Code Online (Sandbox Code Playgroud)
现在的问题是,它在第一次旋转时效果很好。不管第一次旋转。它运作良好,但是对于下一个旋转,它似乎得到了错误的轴和度。
例如,如果坐标系为
然后首先绕逆时针(CCW)旋转X 90度产生
第二次绕Z 90度逆时针旋转产生
我正在尝试/理解图形管道中所需的所有基本数学计算,以从3D场景描述(如VRML)渲染简单的2D图像.是否有一个很好的示例所需的步骤,如模型转换(对象坐标到世界坐标),视图转换(从世界坐标到视图坐标),计算顶点法线用于照明,剪裁,计算视图内对象的屏幕坐标平截头体并创建2D投影以计算具有颜色的各个像素.
所以,我在GLSL和GLM之间遇到了一些奇怪之处.
如果我生成以下视图矩阵(C++):
vec3 pos(4, 1, 1);
vec3 dir(1, 0, 0);
mat4 viewMat = glm::lookAt(pos, pos+dir, vec3(0,0,1));
Run Code Online (Sandbox Code Playgroud)
然后,在glsl中,执行:
fragColour.rgb = vec3(inverse(viewMat) * vec4(0,0,0,1)) / 4.f;
Run Code Online (Sandbox Code Playgroud)
然后我希望屏幕变成粉红色,或(1.0,0.25,0.25).相反,我变黑了.
但是,如果我在GLM中执行此操作:
vec3 colour = vec3(glm::inverse(viewMat) * vec4(0,0,0,1)) / 4.f;
cout << glm::to_string(colour) << endl;
Run Code Online (Sandbox Code Playgroud)
我得到了期望的结果(1.0,0.25,0.25).
现在,如果我将viewMat更改为(C++):
vec3 pos(4, 1, 1);
vec3 dir(1, 0.000001, 0);
mat4 viewMat = glm::lookAt(pos, pos+dir, vec3(0,0,1));
Run Code Online (Sandbox Code Playgroud)
然后bam!我在GLSL和GLM中得到(1.0,0.25,0.25).
这对我来说毫无意义.为什么这样做?这个视图矩阵在GLSL中的其他任何地方都可以正常工作 - 我只是无法反转它.只要dirY == 0.f,就会发生这种情况.
另外,请提出问题标题的改进建议,我不确定它应该是什么.
编辑:此外,它似乎与lookAt的向上向量(我设置为Z无论如何)有任何关系.即使我设置为(0,1,0),也会发生同样的事情.一切都转向侧面,但我仍然无法反转GLSL中的视图矩阵.
编辑:好的,所以在derhass的建议中,我尝试发送倒置的视图矩阵.Bam,效果很好.所以,似乎我的GL实现确实无法反转该矩阵.这很容易成为我遇到的最奇怪的GL错误.但是,为什么在着色器中反转矩阵是一个坏主意的某种解释将是值得赞赏的.EditAgain:在我的引擎中发送倒置矩阵导致了巨大的帧率提升.绝对做到了.
我正在进行车牌识别.问题是我必须对二进制图像中的字符进行去偏斜以提高模板匹配的准确性.
我已经做了很多预处理来删除图像中不必要的像素,我可以将字符分割出来.但不幸的是,它们是扭曲的.
从...转换为灰度到二进制

然后..预处理技术..

分割后..

如在最后一个图像中可以观察到的那样,字符是倾斜的,这将导致模板匹配的不准确性以执行识别目的.
大多数研究人员正在使用Hough变换来执行去偏移操作,但有更简单的方法吗?
我想知道如何使用顶点法线来实现闪电效果?目前我所拥有的是我可以将顶点和纹理坐标发送到着色器并使用它们但是使用法线,我不知道如何在着色器程序中使用它们.以下是我到目前为止的情况.
// vertex shader
layout(location = 0) in vec4 vert;
layout(location = 1) in vec4 color;
layout(location = 2) in vec2 texcoord;
uniform mat4 m_model;
uniform mat4 m_view;
uniform mat4 m_proj;
void main() {
gl_Position = m_proj * m_view * m_model * vert;
}
// fragment shader
in vec2 fragtexcoord;
out vec4 color;
uniform sampler2D textureunit;
void main(void) {
color = texture(textureunit, fragtexcoord);
}
Run Code Online (Sandbox Code Playgroud)
编辑 以下是我的着色器.
顶点着色器
layout(location = 0) in vec4 vert;
layout(location = 1) in vec4 color;
layout(location …Run Code Online (Sandbox Code Playgroud) 我有一个大世界,大约5,000,000 x 1,000,000单位.相机可以靠近某个物体或足够远,以便看到整个世界.
我通过unprojecting(Z来自深度缓冲区)获得世界坐标中的鼠标位置.问题是它涉及矩阵逆.当使用大数字和小数字(例如,从原点平移并缩放以查看更多世界)时,计算变得不稳定.
试图看到这个逆矩阵的准确性,我看一下行列式.理想情况下,由于转换矩阵的性质,它永远不会为零.我知道,'det'一个小值本身并不意味着它,它可能是由于矩阵中的值很小.但它也可能是数字出错的标志.
我也知道我可以通过反转每个变换并乘以它们来计算逆.它提供更准确吗?
如何判断我的矩阵是否退化,是否存在数值问题?
我正在从陀螺仪(MPU6050)读取数据.它给了我角速度.我试图整合这些数据,以了解陀螺仪的角度.我这样做的方法是将读取数据乘以经过的时间并不断累加这些结果,即积分:
但它似乎不起作用,这是我的代码和我得到的输出:
#include <stdio.h>
#include <stdint.h>
#include <time.h>
#include <sys/types.h>
#include <wiringPi.h>
#include <wiringPiI2C.h>
#define A_SCALE (16384.0)
#define ANG_SCALE (131.0)
int main(int argc, char *argv[])
{
int fd;
int data;
int i=0;
float gyroXangle=0;
float gyroYangle=0;
float gyroZangle=0;
float gyroOffset = 151;
float gyroScale = 0.02;
struct timeval startTime, stopTime;
long timeDifference;
int i=0;
wiringPiSetup();
fd = wiringPiI2CSetup(0x68);
wiringPiI2CWriteReg8(fd, 0x6b, 0);
if(fd==-1)
{
printf("can't setup device\n");
return -1;
}
else
{
printf("successfully setup device\n");
while(1) {
msb = wiringPiI2CReadReg8(fd, MPU6050_REG_DATA_START+8); …Run Code Online (Sandbox Code Playgroud) 我有一个物体在地形上移动,第三人称相机跟随它,在我将它向不同方向移动一段距离后,它开始摇晃或振动,即使它没有移动并且相机围绕它旋转,这就是移动对象的代码
double& delta = engine.getDeltaTime();
GLfloat velocity = delta * movementSpeed;
glm::vec3 t(glm::vec3(0, 0, 1) * (velocity * 3.0f));
//translate the objet atri before rendering
matrix = glm::translate(matrix, t);
//get the forward vetor of the matrix
glm::vec3 f(matrix[2][0], matrix[2][1], matrix[2][2]);
f = glm::normalize(f);
f = f * (velocity * 3.0f);
f = -f;
camera.translate(f);
Run Code Online (Sandbox Code Playgroud)
相机旋转是
void Camera::rotate(GLfloat xoffset, GLfloat yoffset, glm::vec3& c, double& delta, GLboolean constrainpitch) {
xoffset *= (delta * this->rotSpeed);
yoffset *= (delta * this->rotSpeed);
pitch += yoffset; …Run Code Online (Sandbox Code Playgroud) 如何在 Three.js 中弧形或弯曲圆柱体类型的几何体(有变形)?
我想指定这些参数:
我将用滑块控制它们。我的圆柱体形状是通过用户绘制的贝塞尔曲线的挤压创建的( Three.js 中几何类的扩展)。
我还希望能够将多个弯曲效果叠加在一起。因此,弯曲可能会影响第一个零件,然后第二个弯曲可能会使圆柱体向后弯曲。
我不是最擅长数学,所以这就是为什么我要求可以在 Three.js 中完成此操作的提示或公式。我想也许我可以在中心轴上放一条线,然后用贝塞尔曲线弯曲它。从那里我可以使用线位置来影响圆柱体的顶点。这听起来是个好主意吗?