我一直在重复并重构一些代码.我最终改变了一个函数:
void setPerspective(float nearP = 0.1f, float farP = 1000.0f);
Run Code Online (Sandbox Code Playgroud)
至
void setPerspective(float near = 0.1f, float far = 1000.0f);
Run Code Online (Sandbox Code Playgroud)
并开始得到很多奇怪'missing ;'和'missing )'错误.
似乎near并且far正在进行#define中windef.h.很公平; 我会避免使用它们.
但后来我注意到另一个头文件:
void setPerspective(float fov, float aspect, float near, float far);
Run Code Online (Sandbox Code Playgroud)
但我没有遇到麻烦.这两个头文件都有相同的#includes ...
知道为什么我会在一个问题中遇到问题,而不是另一个问题吗?它似乎不是默认参数.它是一些任意排序的#includes可能导致一个头文件而不是另一个头文件的问题?
我很好奇*BlockBinding一些与OpenGLs缓冲区对象相关的函数中使用的参数。
例如,该uniformBlockBinding参数中glUniformBlockBinding,storageBlockBinding?在glShaderStorageBlockBinding和对应的index参数glBindBufferRange和glBindBufferBase。
我知道,如果使用布局限定符在着色器中设置绑定点glUniformBlockBinding,glShaderStorageBlockBinding则不必调用和,例如:
layout (binding = 0) blockName {...}
Run Code Online (Sandbox Code Playgroud)
通过在我的机器上进行的测试,我注意到了三件事:
1)使用布局限定符在shader中设置绑定点,glUniformBlockBinding并glShaderStorageBlockBinding覆盖它们。
2)对于相同类型的每个块,从中返回块索引,glGetUniformBlockIndex并按glGetProgramResourceIndex0到n的顺序对其进行排序。例如,如果着色器包含3个统一块和2个缓冲区块,则返回的索引分别为[0,1,2]和[0,1]。
3)绑定点,无论哪种方式设置,都不会在类型之间发生冲突。例如,将统一块设置为binding = 0并将缓冲块设置为binding = 0是完全安全的。
牢记这些假设(如果有必要不一定正确并且只是巧合,请纠正我),有什么原因为什么我不应该让我的代码自动将*BlockBinding参数设置为相应的块索引,从而省去了麻烦呢?通过gl*BlockBinding或通过布局限定符手动指定它们。
我正在尝试实现一个线段和平面相交测试,它将返回true或false,具体取决于它是否与平面相交.它还将返回线相交的平面上的接触点,如果线不相交,则如果线段已经是光线,则该函数仍应返回交点.我使用了Christer Ericson的实时碰撞检测中的信息和代码,但我认为我没有正确实现它.
使用的平面是从三角形的法线和顶点导出的.找到平面上交点的位置是我想要的,无论它是否位于我用来导出平面的三角形上.

该功能的参数如下:
contact = the contact point on the plane, this is what i want calculated
ray = B - A, simply the line from A to B
rayOrigin = A, the origin of the line segement
normal = normal of the plane (normal of a triangle)
coord = a point on the plane (vertice of a triangle)
Run Code Online (Sandbox Code Playgroud)
这是我使用的代码:
bool linePlaneIntersection(Vector& contact, Vector ray, Vector rayOrigin, Vector normal, Vector coord) {
// calculate plane
float d = Dot(normal, …Run Code Online (Sandbox Code Playgroud) 在将向量作为参数传递时,我遇到了一些困难.最初它是一个指针向量的指针,被调用的函数会改变任何obejct调用它的属性.例如,我用过:
(*myVector)[i]->myFunction();
Run Code Online (Sandbox Code Playgroud)
一切都很完美.myFunction()会将任何对象转换为myVector的当前索引.
现在我已经改变了向量来保存一组对象而不是像最初那样指向对象的指针.我没有将指针传递给向量,而是传递了它的引用.我按如下方式访问该函数:
myVector[i].myFunction();
Run Code Online (Sandbox Code Playgroud)
它编译,我发现myFunction()不再具有与之前相同的结果.我使用断点并看到它本来应该更改属性,但是,这些更改从未进入原始对象.即使断点显示myVector [i]的来源发生了变化,也没有最终的翻译.
我已经尝试将指针传递给对象向量并使用:
(*myVector)[i].myFunction();
Run Code Online (Sandbox Code Playgroud)
同样的事情,它编译但没有奏效.
最后我尝试简单地将一个引用传递给向量中的第一个对象,当然这很好用:
myObject.myFunction();
Run Code Online (Sandbox Code Playgroud)
关于向量的引用是否存在一些固有的东西?为什么指向指针向量的指针有效,但对对象向量的引用不起作用?传递的矢量不应该是原始矢量的别名吗?为什么引用显示更改但不引用它引用的对象?
除非我使用指针向量而不是对象向量,否则为什么我的更改不会坚持下去.
我已经尝试按照以下说明提供:http://glew.sourceforge.net/install.html但似乎没有任何效果.首先它说如下安装文件:
bin/glew32.dll到%SystemRoot%/ system32
lib/glew32.lib到{VC Root}/Lib
include/GL/glew.h到{VC Root}/Include/GL
include/GL/wglew.h到{VC Root}/Include/GL
但是在它下面说"安装glew.h,glew32.lib和glew32.dll/libGLEW.so到OpenGL等效的gl.h,opengl32.lib和opengl32.dll所在的位置."这对我来说是另一个文件夹
以防我将文件放在两个位置.在我的项目属性中,然后转到链接器 - >输入add glew32.lib,glu32.lib和opengl32.lib到Additional Dependencies.该项目不会编译.我得到重复错误"LNK2019:未解析的外部符号".
我已经尝试将静态glew32s.lib文件添加到我的项目中,包括glew.h和glew.c,并使用#define GLEW_STATIC,这也不起作用,同样的错误.
我究竟做错了什么?
由于我理解之外的原因,当静态链接时,glew将无法工作.有没有办法简单地将glew.h,glxew.h,wglew.h和glew.c源文件包含到我的项目中并使用
#include "glew.h"
Run Code Online (Sandbox Code Playgroud)
代替
#include <glew.h>
Run Code Online (Sandbox Code Playgroud)
无论什么时候我尝试我都会收到大量的警告:就像
warning C4273: '__WGLEW_NV_render_depth_texture' : inconsistent dll linkage
Run Code Online (Sandbox Code Playgroud) 我运行一个简单的脚本来估计函数的根.一切都很好,算法的每次迭代打印出当前的x和f(x),但是当脚本完成并设置x的最终估计值作为函数的输出时,返回值并舍入到3个小数位. .
while k < maxit
k = k + 1;
dx = b - a;
xm = a + 0.5*dx; % Minimize roundoff in computing the midpoint
fm = feval(fun, xm, diameter, roughness, reynolds);
fprintf('%4d %12.20e %12.4e\n',k,xm,fm);
if (abs(fm)/fref < feps) | (abs(dx)/xref < xeps) % True when root is found
r = xm;
return;
end
Run Code Online (Sandbox Code Playgroud)
这是输出的尾部位:
k xm fm
45 6.77444446476613980000e-003 1.3891e-012
46 6.77444446478035060000e-003 -1.3380e-011
47 6.77444446477324520000e-003 -5.9952e-012
48 6.77444446476969250000e-003 -2.3022e-012
49 6.77444446476791610000e-003 -4.5830e-013
ans =
0.0068
Run Code Online (Sandbox Code Playgroud)
我不知道为什么它的输出四舍五入......我如何防止这种情况?
首先,我想你将顶点和比例相加1/3以找到原点然后从顶点到原点的最大距离.这会产生一个包含三角形的球体,但它不一定是最小的.
有没有一种已知的方法来确定最小的球体以完全封装3D中的任意三角形?
我想渲染四边形,我希望四边形的一边是白色而另一边是黑色.我需要它来模仿余弦函数,而不是对像素之间的简单线性颜色插值.
有什么好方法可以解决这个问题?
如果有可能将std :: vector <>强制转换为双指针,我想知道是出于好奇.
我从来没有遇到过以这种方式将std :: vector作为指针传递的问题:
std::vector<char> myCharVector;
myCharVector.push_back('a');
myCharVector.push_back('b');
myCharVector.push_back('c');
char *myCharPointer = &myCharVector[0];
Run Code Online (Sandbox Code Playgroud)
所以我很好奇是否有可能以类似的方式分配指针的地址:
char *myPointer = "abc";
char **myDoublePointer = &myPointer;
Run Code Online (Sandbox Code Playgroud)
我试过了:
char **myDoublePointer = (char**)&myCharVector;
Run Code Online (Sandbox Code Playgroud)
但它不起作用.有没有办法实现这个目标?