小编AAB*_*AAB的帖子

"没有合适的默认构造函数" - 为什么甚至调用默认构造函数?

我已经看了一些关于这个问题的其他问题,但我不明白为什么在我的情况下甚至应该调用默认构造函数.我可以提供一个默认的构造函数,但我想了解它为什么这样做以及它会影响什么.

error C2512: 'CubeGeometry' : no appropriate default constructor available  
Run Code Online (Sandbox Code Playgroud)

我有一个名为ProxyPiece的类,其成员变量为CubeGeometry.构造函数应该接受CubeGeometry并将其分配给成员变量.这是标题:

#pragma once
#include "CubeGeometry.h"

using namespace std;
class ProxyPiece
{
public:
    ProxyPiece(CubeGeometry& c);
    virtual ~ProxyPiece(void);
private:
    CubeGeometry cube;
};
Run Code Online (Sandbox Code Playgroud)

和来源:

#include "StdAfx.h"
#include "ProxyPiece.h"

ProxyPiece::ProxyPiece(CubeGeometry& c)
{
    cube=c;
}


ProxyPiece::~ProxyPiece(void)
{
}
Run Code Online (Sandbox Code Playgroud)

立方体几何体的标题如下所示.使用默认构造函数对我没有意义.我还需要吗?:

#pragma once
#include "Vector.h"
#include "Segment.h"
#include <vector>

using namespace std;

class CubeGeometry
{
public:
    CubeGeometry(Vector3 c, float l);

    virtual ~CubeGeometry(void);

    Segment* getSegments(){
        return segments;
    }

    Vector3* getCorners(){
        return corners;
    }

    float getLength(){
        return length;
    } …
Run Code Online (Sandbox Code Playgroud)

c++ constructor member default-constructor

13
推荐指数
2
解决办法
3万
查看次数

将3d共面点列表排序为顺时针或逆时针

我有一个3D点列表.我知道他们都是共面的.我有一个中心,我想要对它们进行排序,以及点和中心所在平面的法线.如何测试一个点是否正确(或左)另一个点?

我理解如何在2D中完成它.按顺时针顺序排序点?解释了如何比较2d点.所以我想我需要以某种方式将所有点和中心转换为局部2d平面坐标.我怎样才能做到这一点?这是解决这个问题最有效的方法吗?

//from link:
// a and b are points
//center is the center around which to determine order
//int num = (a.x-center.x) * (b.y-center.y) - (b.x - center.x) * (a.y - center.y);
//if num=0 then they're on the same line
//if num <0 or num>0 then a is to the left or right of b
Run Code Online (Sandbox Code Playgroud)

我如何调整它以处理3d共面点?

math geometry linear-algebra

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

为什么getResourceAsStream()在IDE中工作但在JAR中不起作用?

我只想在我的程序中读取一个文件.该文件位于工作目录上方的一个目录"../f.fsh".因此,当我在IDE中运行它时,以下代码正确运行

String name="../f.fsh";
InputStream is = getClass().getResourceAsStream(name);
InputStreamReader isreader=new InputStreamReader(is);//CRASHES HERE WITH NULL POINTER EXCEPTION
BufferedReader br = new BufferedReader(isreader);
Run Code Online (Sandbox Code Playgroud)

但是当我创建一个在其中压缩了f.fsh并运行它的JAR文件时,它会在创建InputStreamReader时崩溃,因为InputStream为null.

我已经阅读了一些关于输入流和JAR文件的问题的答案,我从中得到的是我应该使用相对路径,但我已经这样做了.根据我的理解,getResourceAsStream()可以找到相对于项目根目录的文件,这就是我想要的.为什么它在JAR中不起作用?出了什么问题,我该如何解决?

它与classpath有关吗?我认为这只是为了包含正在运行的jar外部的文件.

在尝试使用斜杠时,我也尝试了但仍然失败了:

InputStream is = getClass().getResourceAsStream("\\"+name);
Run Code Online (Sandbox Code Playgroud)

我看了一下:如何获取Java JAR文件中的资源路径,并发现JAR的内容可能不一定可以作为文件访问.所以我尝试将文件相对于jar(jar中的一个目录)复制,但仍然失败.在任何情况下,我都希望将我的文件留在jar中,并能够在那里阅读它们.我不知道出了什么问题.

java eclipse file-io jar inputstream

7
推荐指数
2
解决办法
5044
查看次数

从四元数到欧拉角以及反向的错误转换

我正在将角度轴表示形式转换为欧拉角。我决定检查并确保从转换中得到的欧拉角会回到原始的轴角。我打印出值,但它们不匹配!我已经阅读了http://forum.onlineconversion.com/showthread.php?t=5408http://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles以及本网站上的类似转换问题。

在下面的代码中,我从角度“ angle”和轴(rx,ry,rz)开始,然后将其转换为四元数(q0,q1,q2,q3)。我将四元数转换为欧拉角(滚动,俯仰,偏航)。然后要检查它,我将(roll,pitch,yaw)转换为cAngle和(cRx,cRy,cRz)的轴角。然后,我对(滚动,俯仰,偏航)进行一些边界检查,以将数字保持在-pi和pi之间,然后将它们打印出来。应该是cAngle = angle和(cRx,cRy,cRz)=(rx,ry,rz),但这两个都是错误的。

我相信旋转是常见的Z * Y * X顺序。我的数学有问题吗?我打算最终在俯仰为0或PI时添加特殊情况,如http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToEuler/,但现在我认为问题是独立的。

        //input is angle 'angle' and axis '(rx,ry,rz)'

        //convert rx,ry,rz, angle, into roll, pitch, yaw
        double q0 = Math.Cos(angle / 2);
        double q1 = Math.Sin(angle / 2) *Math.Cos(rx);
        double q2 = Math.Sin(angle / 2) * Math.Cos(ry);
        double q3 = Math.Sin(angle / 2) * Math.Cos(rz);
        double roll = Math.Atan2(2 * (q0 * q1 + q2 * q3), 1 - 2 * (q1 * q1 + q2 …
Run Code Online (Sandbox Code Playgroud)

math angle rotation quaternions

4
推荐指数
1
解决办法
6099
查看次数

将GLEW与Visual Studios联系起来的问题

我已经尝试了几种方法让GLEW使用我的VS2010项目.没有成功.起初我尝试使用网站上预先构建的库和dll.我从http://glew.sourceforge.net/index.html下载了这些预先构建的文件并做了类似的事情:设置GLEW窗口?

  1. .h文件放在C:\ Program Files(x86)\ Microsoft SDKs\Windows\v7.0A\Include中

  2. .lib文件放在C:\ Program Files(x86)\ Microsoft SDKs\Windows\v7.0A\Lib\x64中(我还将它们放在一级以防万一)

  3. glew32.dll转到C:\ Windows\SysWOW64

  4. linker-> input将glew32.lib,GlU32.lib和OpenGL32.lib添加到其他依赖项

  5. 预处理器定义:放入GLEW_BUILD和GLEW_STATIC(我的程序需要是一个DLL,但其他似乎与STATIC成功,所以我包括两者)

当我使用这些设置运行程序时,glewInit()不是那么GLEW_OK.即使glewInit()失败,它仍然会奇怪地识别该函数.当我使用另一个glew函数,如"glCreateProgram()"时,我收到以下错误:

Error   56  error LNK2020: unresolved token (0A000327) __glewCreateProgram  
C:\Users\aab\studyWrist\Visualization\libCoin3D\ShaderHandler.obj   libCoin3D

Error   57  error LNK2001: unresolved external symbol __glewCreateProgram   
C:\Users\aab\studyWrist\Visualization\libCoin3D\ShaderHandler.obj   libCoin3D

Error   58  error LNK1120: 2 unresolved externals   
C:\Users\aab\studyWrist\Visualization\libCoin3D\Debug\libCoin3D.dll libCoin3D
Run Code Online (Sandbox Code Playgroud)

所以,关于stackoverflow的一些其他建议是重建glew.接下来我尝试在VS2010中构建glew32d.我关注OpenGL:如何从源文件编译glew32.dll并得到glew32d.dll和glew32d.lib.

  1. glew32d.lib放入C:\ Program Files(x86)\ Microsoft SDKs\Windows\v7.0A\Lib\x64(如果我把它放在x64文件夹中,程序只识别lib,而不是升级)

  2. glew32d.dll转到C:\ Windows\SysWOW64

  3. 链接器 - >输入添加glew32d.lib(这个已更改),GlU32.lib和OpenGL32.lib添加到其他依赖项

  4. 预处理器定义:放入GLEW_BUILD和GLEW_STATIC

我的以下错误仅由glewInit引起:

Error   56  error LNK2028: unresolved token (0A000383) "extern "C" unsigned int 
__cdecl glewInit(void)" (?glewInit@@$$J0YAIXZ) referenced in …
Run Code Online (Sandbox Code Playgroud)

opengl linker glew visual-studio-2010

4
推荐指数
1
解决办法
1万
查看次数

如何从OpenGL ModelView Matrix获取视图方向?

我正在编写一个体积渲染程序,它不断调整某些平面几何体,因此它总是面向相机.每当相机旋转时,平面几何体就会旋转,以使其看起来好像不会移动 - 相对于场景中的其他所有内容.(我使用相机的观察方向作为这些平面几何的法线向量.)

目前我手动存储自定义旋转矢量('旋转')并在渲染函数中应用其影响如下:

gl2.glRotated(rotations.y, 1.0, 0.0, 0.0);
gl2.glRotated(rotations.x, 0.0, 1.0, 0.0);
Run Code Online (Sandbox Code Playgroud)

然后我通过使用旋转值围绕x和y轴旋转初始视图方向(0,0,-1)来获得查看方向.这是以下面的方式完成的.最终的查看方向存储在"视图"中:

     public Vec3f getViewingAngle(){
        //first rotate the viewing POINT
        //then find the vector from there to the center
        Vec3f view=new Vec3f(0,0,-1);
        float newZ=0;
        float ratio=(float) (Math.PI/180);
        float vA=(float) (-1f*rotations.y*(ratio));
        float hA=(float) (-1f*rotations.x)*ratio;

        //rotate about the x axis first
        float newY=(float) (view.y*Math.cos(vA)-view.z*Math.sin(vA));
        newZ=(float) (view.y*Math.sin(vA)+view.z*Math.cos(vA));
        view=new Vec3f(view.x,newY,newZ);

        //rotate about Y axis
        float newX=(float) (view.z*Math.sin(hA)+view.x*Math.cos(hA));
        newZ=(float) (view.z*Math.cos(hA)-view.x*Math.sin(hA));
        view=new Vec3f(newX,view.y,newZ);
        view=new Vec3f(view.x*-1f,view.y*-1f,view.z*-1f);

        //return the finalized normal viewing direction
        view=Vec3f.normalized(view);
        return view;
} …
Run Code Online (Sandbox Code Playgroud)

opengl math rotation volume-rendering

3
推荐指数
1
解决办法
1万
查看次数

如何将 1d 索引转换为 3d 索引?

我查看了这个问题:Convert a 1d array index to a 3d array index? 但无论我一开始如何计算指数,当我测试它时,我的结果都会有所不同。

我使用以下方法将尺寸(宽度、高度、深度)的 3d (x,y,z) 转换为 1d:

i=x+WIDTH(y+HEIGHT*z)
Run Code Online (Sandbox Code Playgroud)

然后从索引 i 转换回 (x,y,z):

z=i/(HEIGHT*WIDTH)
y=(i/WIDTH)%HEIGHT
x=i%(WIDTH)
Run Code Online (Sandbox Code Playgroud)

当我在两种方法之间进行测试时,我得到了错误的结果。我的方法明显有问题吗?正确的解释是什么?

arrays 3d indexing multidimensional-array

2
推荐指数
1
解决办法
3891
查看次数

如何创建具有负值的 3d 纹理并从着色器中读取它

我编写了一个体积渲染程序,可以将一些 2d 图像转换为可由用户旋转的 3d 体积。我需要通过在点周围的每个方向上取梯度来计算 3d 纹理(用于照明)中每个点的法线。

计算法线需要在片段着色器中进行六次额外的纹理访问。如果没有这些额外的纹理访问,程序会快得多,所以我试图以字节为单位预先计算每个方向 (x,y,z) 的梯度并将其存储在原始纹理的 BGA 通道中。当我在 CPU 上测试时,我的字节似乎包含正确的值,但是当我到达着色器时,它看起来是错误的。很难说它为什么从着色器中失败,我认为这是因为某些梯度值是负的。但是,当我将纹理类型指定为 GL_BYTE(而不是 GL_UNSIGNED_BYTE)时,它仍然是错误的,这会弄乱原始纹理的外观。仅通过将数据渲染为颜色,我无法确切地知道出了什么问题。将负值放入纹理的正确方法是什么?当我在片段着色器中读取值时,如何知道该值为负数?

以下代码显示了我如何运行该操作以从字节数组 (byte[] all) 计算梯度,然后将其转换为作为 3d 纹理读入的字节缓冲区 (byteBuffer bb)。函数 'toLoc(x,y,z,w,h,l)' 简单地返回 (x+w*(y+z*h))*4)——它将 3d 下标转换为 1d 索引。图像是灰度的,所以我丢弃了 gba,只使用 r 通道来保存原始值。剩余的通道 (gba) 存储梯度。

        int pixelDiffxy=5;
    int pixelDiffz=1;

    int count=0;  
    Float r=0f;
    byte t=r.byteValue();

    for(int i=0;i<w;i++){
        for(int j=0;j<h;j++){
            for(int k=0;k<l;k++){
                count+=4;
                if(i<pixelDiffxy || i>=w-pixelDiffxy || j<pixelDiffxy || j>=h-pixelDiffxy || k<pixelDiffz || k>=l-pixelDiffz){
                    //set these all to zero since they are out of bounds
                    all[toLoc(i,j,k,w,h,l)+1]=t;//green=0
                    all[toLoc(i,j,k,w,h,l)+2]=t;//blue=0
                    all[toLoc(i,j,k,w,h,l)+3]=t;//alpha=0
                }
                else{ …
Run Code Online (Sandbox Code Playgroud)

opengl shader byte textures jogl

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