我想在我的基于Windows的软件中渲染4百万个三角形,该软件是用Visual Studio C++ 2010(在发布模式下构建)编写的.当我渲染3.9百万个三角形时,软件消耗的总RAM内存为400MB.但是当我尝试渲染4百万个三角形(仅多100K)时,系统会给我一个错误.
For Example:
Point *P = new (std::nothrow) Point[nb_triangles]; //==> "(std::nothrow)" is for catching the run time memory allocation error. (Point is X, Y, Z floats)
If(P == NULL)
message("System can't allocate this much memory."); // System gives me this error. It means the system can't reserve huge memory for this operation.
Run Code Online (Sandbox Code Playgroud)
我必须为顶点,面法线,顶点法线等分配内存.
其实我没有得到的是,我有8 GB RAM内存,(但在32位XP窗口= 3.2GB内存),软件只保留400MB,可用内存超过1 GB,但当我尝试只渲染100K三角形,它给了我一个错误.为什么它给我一个错误?因为它还有超过1 GB的可用RAM内存?
无论如何要解决这个问题,如何为我的应用程序分配所有可用内存?由于这个问题,我必须在软件中限制只是为了渲染3.9亿个三角形而且它并不好.
还有一个问题在于,c ++"new"运算符用于内存分配给我错误,c"malloc"运算符怎么样?可以"malloc"解决这个问题,这两者之间有什么不同?
请指导我.谢谢.
更新#1:
我已经尝试了很多,修改代码,删除内存泄漏等,但我不能分配超过4百万的内存.它不可能将我的整个代码更改为"向量".我不能改成"向量",我现在必须用"新"来坚持我自己的数据结构.以下是我想要分配以呈现1个对象的指针.
P = new points[10000000]; // points is the class with 3 floats …Run Code Online (Sandbox Code Playgroud) 有两种表面网格模型,闭合网格像球体或立方体,第二种是开放网格模型,这意味着模型的表面不是闭环.它从一个像空心管道的地方开放.Sp我想要的是我想检测开放网格模型的边界顶点.闭环网格中没有边界,但在开放网格中,我们必须检测边界顶点以进行一些平滑,细分等操作.请建议我如何选择/检测边界顶点?这样做的最佳方式是什么?通过比较三角形的边缘?给我一些想法?
谢谢.
我实时渲染500x500点.我必须使用atan()和sin()函数计算点的位置.通过使用atan()和sin(),我获得24 fps(每秒帧数).
float thetaC = atan(value);
float h = (value) / (sin(thetaC)));
Run Code Online (Sandbox Code Playgroud)
如果我不使用sin(),我得到52 fps.
如果我不使用atan()我是30 fps.
所以,最大的问题是sin().我怎样才能使用Fast Sin版本.我可以为此创建一个查找表吗?我没有任何特定的值来创建LUT.在这种情况下我该怎么办?
PS:我也尝试过快速的ASM功能,但没有任何区别.
谢谢.
首先让我澄清一下..我不是在问 2D 网格,要确定 2D 网格的缠绕顺序,使用法向 z 方向非常容易。
其次,我不要求任何优化算法,我不担心时间或速度,我只想用我的网格来做。
当我使用贪婪投影三角剖分算法对 3D 对象进行三角剖分时,会发生此问题。检查所附图片。
如果我使用“计算有符号面积”或“三角形的 AB 和 BC 向量的交叉产生”对该模型应用 2D 方法,它只能求解 2D 网格,但 3D 网格又如何呢?
首先我们需要检查哪些三角形在 3D 网格中缠绕方向错误,然后我们只考虑这些三角形,那么问题是,我们如何检查哪些三角形在 3D 中缠绕方向错误?我们不能只用 2D 方法来做我已经测试过但没有成功。
例如,对于球体,我们不能对球体应用 2D 方法。那么有没有办法解决这个问题呢?
谢谢。

更新#1:
下面是检查哪条边具有相同缠绕的算法。效果不太好,我不知道为什么。理论上它应该纠正所有三角形,但它没有纠正。例如,在附图中检查球体的情况下。有问题。
void GLReversedEdge(int i, int j, GLFace *temp)
{
//i'th triangle
int V1 = temp[i].v1;
int V2 = temp[i].v2;
int V3 = temp[i].v3;
//i'th triangle edges
int E1[] ={V1, V2};
int E2[] ={V2, V3};
int E3[] ={V3, V1};
//adjacent triangle
int jV1 = temp[j].v1;
int jV2 …Run Code Online (Sandbox Code Playgroud) 我在我的球体上有错误的纹理贴图.这个问题众所周知,但解决方案很少见.
这是我为球体生成UV的代码.
T =三角形,Nv =顶点法线.
for (int i=0; i<nbF; i++)
{
float tx1 = atan2(Nv[T[i].v1].x, Nv[T[i].v1].z) / (2.0f*M_PI) + 0.5f;
float ty1 = asinf(Nv[T[i].v1].y) / M_PI + 0.5f;
float tx2 = atan2(Nv[T[i].v2].x, Nv[T[i].v2].z) / (2.0f*M_PI) + 0.5f;
float ty2 = asinf(Nv[T[i].v2].y) / M_PI + 0.5f;
float tx3 = atan2(Nv[T[i].v3].x, Nv[T[i].v3].z) / (2.0f*M_PI) + 0.5f;
float ty3 = asinf(Nv[T[i].v3].y) / M_PI + 0.5f;
float n = 0.75f;
if(tx2 < n && tx1 > n)
tx2 += 1.0;
else if(tx2 > n …Run Code Online (Sandbox Code Playgroud) C2表面/网格是CAD/OpenGL中众所周知的表面.但我只是想知道什么是C2意味着什么?
C意味着什么?
2意味着什么?
C2 =首字母缩略词???????
通过鼠标拾取拖动 3D 点的最佳方法是什么?问题不在于拾取,而在于在 3D 空间中拖动。
我想有两种方法,一种是使用 gluUnProject 获取世界视图坐标并平移 3D 点。这种情况下的问题是,它仅在具有深度值的表面上(使用 glReadPixels),如果鼠标离开表面,它会根据 gluUnProject 的 winZ 组件给出最大或最小深度值。而且在某些情况下它不起作用。
第二种方法是使用 GL_MODELVIEW_MATRIX 沿 XY、XZ、YZ 平面拖动。但这种情况下的问题是,我们如何知道我们是在 XY、XZ 还是 YZ 平面上?我们如何知道轨迹球的前视图在 XY 平面内,如果我们想在侧平面而不是前平面上拖动怎么办?
那么,有没有什么方法可以为我提供准确的 2D 到 3D 坐标,以便我可以轻松地在各个方向上拖动 3D 点,而无需考虑平面情况?一定有办法的,我见过3D软件,他们有完美的拖动功能。
我已经申请了高分辨率图像.
当我想分配大量内存时,系统会说"应用程序已经请求运行时以不寻常的方式终止它".但我想要的是,分配的指针必须返回0或NULL,我可以显示我的消息.它不返回零/ NULL为什么?任何的想法?我检查了调试,然后继续到MessageBox,它给出了这个错误.该怎么做才能显示我的信息?
有没有办法检查用户是否要分配足够大的内存而不是计算机PC容量?
谢谢.
ImageW = 2000;
ImageH = 2000;
point *Img = NULL;
Img = new point[ImageW*ImageH];
if(Img== NULL)
{
MessageBox(0, "Your computer memory is too small.", "Error", MB_ICONERROR | MB_OK);
return;
}
Run Code Online (Sandbox Code Playgroud) 我想要的是使用我的小型LicenseExe应用程序启动我的主应用程序.
LicenseExe将检查该系统是否已注册.
如果系统未注册,则应退出LicenseExe.如果系统已注册,则LicenseExe将调用ShellExecute或执行主应用程序exe的任何方法.
这很容易我能做到这一点.
我想要的是,我的主应用程序永远不能通过直接双击其exe文件来执行.它仅由LicenseExe应用程序执行.可能吗?
这是使我的应用程序获得许可的一种技巧.所以,请指导我.如何直接停止执行我的主应用程序并使其依赖于我的小型LicenseExe应用程序.
主应用程序只能从LicenseExe应用程序启动,而不是通过双击而不是通过命令行启动.
我在Windows 7平台下使用C++ Visual Studio 2010.
哪种方法更好更快,为什么?
for (unsigned int i=0; i<meshes.size(); i++)
{
meshes.erase(meshes.begin() + i);
if(meshes[i]) delete meshes[i];
}
Run Code Online (Sandbox Code Playgroud)
还是这一个......
for (auto it = meshes.begin(); it != meshes.end(); ++it)
delete *it;
meshes.clear();
Run Code Online (Sandbox Code Playgroud) 我想知道在3D中找到任意形状中心的准确方法.在图中,我已经解释了3个案例.
在第一种情况下,我们如何计算任意点的中心?一个想法是所有点的总和除以总点数.这是唯一的方法,它是否准确?
第二是如何计算3D中不规则任意形状的近似中心?这是1的相同情况吗?
我们如何计算由任意顶点组成的弯曲/弯曲管的中心线?对于这个问题,我们必须先解决两个案例吗?

c++ ×6
opengl ×4
c ×3
math ×3
3d ×2
geometry ×2
graphics ×2
mesh ×2
visual-c++ ×2
algorithm ×1
c++11 ×1
c++14 ×1
cad ×1
coordinates ×1
normals ×1
performance ×1
surface ×1
trigonometry ×1
uv-mapping ×1
vertex ×1