小编Gar*_*ckW的帖子

无法打开输出文件,权限被拒绝

因此,在尝试使用CodeBlocks编译C++代码时,我不断收到此错误.

无法打开输出文件[filename.exe]权限被拒绝

它只是从今天开始,它是零星的,不一致的.如果我关闭CodeBlocks并重新启动项目,它通常会消失,但并非总是如此.有时它甚至会在我按F9(构建和运行)几次时消失.我总是检查任务管理器,但是从来没有任何.EXE运行我的文件名或与之相关的任何内容.

我也注意到,如果出现这个问题,然后我尝试手动删除.EXE或以其他方式与之交互,Windows告诉我需要管理员权限才能这样做(这是一台私人电脑,据我所知我我是它的管理员).

它第一次出现时,我在代码中添加的唯一超出之前版本的内容就是发送给cout的调试报告 - 几乎没有什么是神秘的.即使没有从先前版本更改代码,有时也会发生这种情况.

这可能是什么?这不是破坏游戏的,但它令人恼火,我宁愿它也不会变得更糟.

编辑:这已经过时了,但是为了防止其他人遇到类似的问题,我目前使用的解决方法是在尝试再次运行代码之前始终删除[filename.exe].这可以避免这个问题,尽管它很烦人.

c++ compiler-errors codeblocks permission-denied

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

使用四元数进行OpenGL旋转

所以我正在编写一个程序,其中对象围绕着spaceim风格移动,以便学习如何在3D空间中平滑地移动物体.在稍微弄清楚欧拉角度之后,看起来它们并不适合任意方向的自由形式3D运动,所以我决定继续寻找最适合这项工作的东西 - 四元数.我打算让对象始终围绕其局部XYZ轴旋转,而不是围绕全局XYZ轴旋转.

我试图使用四元数实现旋转系统,但有些东西不起作用.沿单轴旋转物体时,如果没有进行先前的旋转,则物体沿给定轴旋转精细.但是,当执行一个接一个的旋转后,第二个旋转并不总是沿着它应该旋转的局部轴 - 例如,绕Z轴旋转约90°后,围绕Y轴旋转仍然发生在全局Y轴周围,而不是与全局X轴对齐的新的局部Y轴.

呵呵.让我们一步一步来看看.错误必须在某处.

第1步 - 捕获输入

我认为最好使用Euler角度(或Pitch-Yaw-Roll方案)来捕捉玩家输入.此时,箭头键控制俯仰和偏航,而Q和E控制滚动.我捕获了播放器输入(我正在使用SFML 1.6):

    ///SPEEDS
    float ForwardSpeed = 0.05;
    float TurnSpeed = 0.5;

    //Rotation
    sf::Vector3<float> Rotation;
    Rotation.x = 0;
    Rotation.y = 0;
    Rotation.z = 0;
    //PITCH
    if (m_pApp->GetInput().IsKeyDown(sf::Key::Up) == true)
    {
        Rotation.x -= TurnSpeed;
    }
    if (m_pApp->GetInput().IsKeyDown(sf::Key::Down) == true)
    {
        Rotation.x += TurnSpeed;
    }
    //YAW
    if (m_pApp->GetInput().IsKeyDown(sf::Key::Left) == true)
    {
        Rotation.y -= TurnSpeed;
    }
    if (m_pApp->GetInput().IsKeyDown(sf::Key::Right) == true)
    {
        Rotation.y += TurnSpeed;
    }
    //ROLL
    if (m_pApp->GetInput().IsKeyDown(sf::Key::Q) == true)
    {
        Rotation.z -= TurnSpeed; …
Run Code Online (Sandbox Code Playgroud)

c++ opengl 3d quaternions sfml

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

"看着"具有四元数的对象

所以我目前正在尝试创建一个函数,它将采用两个3D点A和B,并为我提供四元数,表示点A要求"看"点B所需的旋转(这样点A的局部Z轴通过B点,如果你愿意).

我最初发现这篇文章,其中最重要的答案似乎为我提供了一个很好的起点.我继续实现以下代码; 而不是假设默认(0,0,-1)方向,正如原始答案所示,我尝试提取表示相机实际方向的单位向量.

void Camera::LookAt(sf::Vector3<float> Target)
{
    ///Derived from pseudocode found here:
    ///https://stackoverflow.com/questions/13014973/quaternion-rotate-to

    //Get the normalized vector from the camera position to Target
    sf::Vector3<float> VectorTo(Target.x - m_Position.x,
                                Target.y - m_Position.y,
                                Target.z - m_Position.z);
    //Get the length of VectorTo
    float VectorLength = sqrt(VectorTo.x*VectorTo.x +
                              VectorTo.y*VectorTo.y +
                              VectorTo.z*VectorTo.z);
    //Normalize VectorTo
    VectorTo.x /= VectorLength;
    VectorTo.y /= VectorLength;
    VectorTo.z /= VectorLength;

    //Straight-ahead vector
    sf::Vector3<float> LocalVector = m_Orientation.MultVect(sf::Vector3<float>(0, 0, -1));

    //Get the cross product as the axis of rotation
    sf::Vector3<float> Axis(VectorTo.y*LocalVector.z - VectorTo.z*LocalVector.y, …
Run Code Online (Sandbox Code Playgroud)

c++ opengl rotation quaternions sfml

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

如何使用CodeBlocks安装Boost库?

所以我在这里结束了我的路线; 我正在研究保存文件和序列化,只是为了了解C++没有Python所具有的本机序列化能力pickle.但幸运的是,它有Boost - 所以我开始在我的系统上安装Boost 1.47,以便能够序列化我的对象.

到目前为止,没有成功.我首先想到我可以使用它:http://wiki.codeblocks.org/index.php?title = BoostWindowsQuickRef,但我不断发现版本错误不匹配,并且在尝试多次找到与1.47兼容的Boost Jam之后(我只发现1.3.19,似乎是为1.46而建的),我看到这个页面已经过了一年半了.

然后,经过多次搜索,我在此指出:http://www.boost.org/doc/libs/1_47_0/doc/html/bbv2/installation.html.但这也不起作用.运行\ bootstrap.bat时,我收到以下错误:

无法构建Boost.Build引擎.请参阅bootstrap.log以获取进一步的诊断信息.

嗯 - 好吧,没有任何类型的.log文件,但有一个名为bootstrap的文本文件,其中包含以下内容:

Setting environment for using Microsoft Visual Studio 2010 x86 tools.
###
### Using 'vc10' toolset.
###

c:\Program Files (x86)\CodeBlocks\MinGW\downloaded\boost_1_47_0\tools\build\v2\engine>if exist bootstrap rd /S /Q bootstrap 

c:\Program Files (x86)\CodeBlocks\MinGW\downloaded\boost_1_47_0\tools\build\v2\engine>md bootstrap 

c:\Program Files (x86)\CodeBlocks\MinGW\downloaded\boost_1_47_0\tools\build\v2\engine>cl /nologo /RTC1 /Zi /MTd /Fobootstrap/ /Fdbootstrap/ -DNT -DYYDEBUG -wd4996 kernel32.lib advapi32.lib user32.lib /Febootstrap\jam0  command.c compile.c debug.c execnt.c expand.c filent.c glob.c hash.c hdrmacro.c headers.c …
Run Code Online (Sandbox Code Playgroud)

c++ boost codeblocks

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

#leror gl.h包含在glew.h之前

所以我试图将我的OpenGL代码从Main()移动到一个特定的类中,该类只在必要时处理3D图形.以前,我的main.cpp文件的顶部看起来像这样:

#define GLEW_STATIC
#include <GL/glew.h>
#include <SFML/Graphics.hpp>
#include <cstdlib>
#include <iostream>
#include <fstream>
#include "Game.h"
Run Code Online (Sandbox Code Playgroud)

这很好用.我试图做的是将所有与OpenGL相关的代码移到Game类的方法中.所以我删除#define GLEW_STATIC,并#include <GL/glew.h>从上面的,并把它们放到Game.h,这样Game.h的顶部,现在看起来是这样的:

#define GLEW_STATIC
#include <GL/glew.h>
#include <SFML/Graphics.hpp>
#include <cstdlib>
#include <iostream>
#include <fstream>
#include "Environment.h"
Run Code Online (Sandbox Code Playgroud)

当我尝试编译时,我得到标题错误,#error gl.h included before glew.h.

为什么会发生这种情况,如何在不发生这种情况的情况下(几乎)完全在特定类的函数内部使用OpenGL代码?

编辑:

我也在main.cpp中尝试过这个配置,试图确保在GLEW之前没有包含任何SFML.

#include <cstdlib>
#include <iostream>
#include <fstream>
#include "Game.h"
#include <SFML/Graphics.hpp>
Run Code Online (Sandbox Code Playgroud)

不幸的是,这没有帮助(没有其他任何内容,我在这里没有提到).

c++ opengl codeblocks include sfml

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

平均圆值(特别是HSL颜色方案中的色调)

所以我试图弄清楚如何计算颜色由HSL值表示的多个对象的平均色调.值得庆幸的是,我偶然发现了这个Stack Overflow帖子,并开始实现顶部答案中提供的算法(我在C++中工作).

不幸的是,我的实现似乎不起作用.在这里,它是完整的; 请注意,虽然我写了"Hue",但我按照初始实现使用角度(以度为单位)(从0-360角度切换到0-256色调,一旦我知道我的代码有效,就不应该很难).

#include <iostream>    
#include <vector>
#include <cmath>

#define PI (4*atan(1))

int main()
{
    ///
    /// Calculations adapted from this source:
    /// https://stackoverflow.com/questions/8169654/how-to-calculate-mean-and-standard-deviation-for-hue-values-from-0-to-360

    std::vector<double> Hues = {355, 5, 5, 5, 5};

    //These will be used to store the sum of the angles
    double X = 0.0;
    double Y = 0.0;

    //Loop through all H values
    for (int hue = 0; hue < Hues.size(); ++hue)
    {
        //Add the X and Y values to the sum X and …
Run Code Online (Sandbox Code Playgroud)

c++ math hsl colors

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

学习正确使用VBO

所以我一直在努力教自己使用VBO,以提高我的OpenGL项目的性能,并学习比固定功能渲染更高级的东西.但是我没有找到一个体面的教程方式; 到目前为止我发现的最好的是Songho的教程OpenGL.org上的内容,但我似乎缺少某种背景知识来完全理解发生了什么,虽然我无法确切地知道它是什么我'没有得到,保存一些参数的使用.

在任何情况下,我都在前进并提出一些相似的代码,至少不会崩溃,但它会导致奇怪的结果.我要渲染的是这个(使用固定功能渲染;它应该是棕色的,背景为灰色,但我所有的OpenGL截图似乎都采用洋红色作为他们喜欢的颜色;也许是因为我在窗口使用SFML?).

目标图像

但是,我得到的是:

实际图像

我不知所措.这是我使用的相关代码,首先是设置缓冲区对象(我按照这个人的建议分配大量内存来分配4-8MB):

GLuint WorldBuffer;
GLuint IndexBuffer;

...

glGenBuffers(1, &WorldBuffer);
glBindBuffer(GL_ARRAY_BUFFER, WorldBuffer);
int SizeInBytes = 1024 * 2048;
glBufferData(GL_ARRAY_BUFFER, SizeInBytes, NULL, GL_STATIC_DRAW);

glGenBuffers(1, &IndexBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexBuffer);
SizeInBytes = 1024 * 2048;
glBufferData(GL_ELEMENT_ARRAY_BUFFER, SizeInBytes, NULL, GL_STATIC_DRAW);
Run Code Online (Sandbox Code Playgroud)

然后将数据上传到缓冲区.请注意,CreateVertexArray()使用顶点数据填充传递位置处的向量,每个顶点为位置提供3个浮点数,为正常提供3个浮点数(关于各种教程最令人困惑的事情之一是我应该存储和转移我的实际格式顶点数据;这似乎是一个不错的近似):

std::vector<float>* VertArray = new std::vector<float>;
pWorld->CreateVertexArray(VertArray);
unsigned short Indice = 0;
for (int i = 0; i < VertArray->size(); ++i)
{
    std::cout << (*VertArray)[i] << std::endl;
    glBufferSubData(GL_ARRAY_BUFFER, i * sizeof(float), sizeof(float), &((*VertArray)[i]));
    glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, i * sizeof(unsigned …
Run Code Online (Sandbox Code Playgroud)

c++ opengl codeblocks vbo sfml

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

OpenGL线没有着色

我在OpenGL中工作,有VBO,我有一组三条线(沿X,Y和Z轴 - 想捷克刺猬).这些线条默认为灰色,但我希望它们是鲜红色,这样我就可以更好地看到它们.不幸的是,尽管我将颜色信息添加为顶点数据,但这些线仍然显示为灰色.我可能遗漏了一些基本的东西,但我看不到它.以下是我创建VBO的方法:

//Position data
sf::Vector3<float> Top    = sf::Vector3<float>(0.0, 1.0, 0.0);
sf::Vector3<float> Front  = sf::Vector3<float>(0.0, 0.0, -1.0);
sf::Vector3<float> Right  = sf::Vector3<float>(1.0, 0.0, 0.0);
sf::Vector3<float> Back   = sf::Vector3<float>(0.0, 0.0, 1.0);
sf::Vector3<float> Left   = sf::Vector3<float>(-1.0, 0.0, 0.0);
sf::Vector3<float> Bottom = sf::Vector3<float>(0.0, -1.0, 0.0);

//Color data
//Just to be clear, I also tried with 255.0, although I'm rather certain OpenGL 
//does its colors on a 0-1 scale.
sf::Vector3<float> Color = sf::Vector3<float>(1.0, 0.0, 0.0);

//Create vector
std::vector<float> LineArray;

//Top
LineArray.push_back(Top.x);
LineArray.push_back(Top.y);
LineArray.push_back(Top.z);
LineArray.push_back(Color.x);
LineArray.push_back(Color.y); …
Run Code Online (Sandbox Code Playgroud)

c++ opengl vbo sfml

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

通过自己划分浮点产生非常大的整数

所以我觉得在我看来这是一个非常奇怪的问题.我有一个粗略的系统,用于在2D平面上对物体施加力,其中一个最简单的计算似乎是导致我的一个变量溢出.我有以下几行:

int ySign = m_Momentum.y / abs(m_Momentum.y);

Momentum有两个数据成员,x y(m_Momentum是一个SFML sf :: Vector2 of floats).现在,通常公式应该总是返回1或-1,这取决于Momentum.y的符号(除非我非常错误).

然而,它偶尔会返回极其高的数字,如-2147483648.在那种特殊情况下,m_Momentum.y的值是0.712165(两个值都是通过发送到std :: cout获得的); 我再次尝试,m_Momentum.y是-0.578988,而ySign仍然是-2147483648.有一个相应的xSign有时会翻转,通常具有相同的最终值.我不能100%确认这总是结果,但目前似乎是这种情况.

我有点难以理解为什么会这样,当它发生时,它基本上使我的程序无效(它会立即向错误的方向发送数百万像素的对象).从逻辑上看,上面的这一行似乎不可能返回如此奇怪的结果.

以下是我正在处理的功能.可能是错误的做法,但我没想到会出现如此可怕的错误.它产生的打印输出显示所有数字看起来都正常,直到打印出标志; 其中一个总是很大,然后你会看到像-2.727e + 008这样的数字(据我所知,这是科学记数法 - 即-2.727*10 ^ 8).

///MODIFY MOMENTUM
//Reset, if necessary
if (Reset == true)
{
    m_Momentum.x = 0;
    m_Momentum.y = 0;
}
sf::Vector2<float> OldMoment = m_Momentum;

//Apply the force to the new momentum.
m_Momentum.x += Force.x;
m_Momentum.y += Force.y;
sf::Vector2<float> NewMoment = m_Momentum;

//Calculate total momentum.
float sqMomentum = m_Momentum.x * m_Momentum.x + m_Momentum.y * m_Momentum.y; …
Run Code Online (Sandbox Code Playgroud)

c++ math sfml

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

继承错误困境:"无效使用不完整类型"VS"预期类名"

所以我试图让班级"Herder"继承"Mob"班.但我收到的编译器错误如下:

error: invalid use of incomplete type 'struct Mob'
error: forward declaration of 'struct Mob'
Run Code Online (Sandbox Code Playgroud)

这就是Herder.h的样子:

#ifndef HERDER_H_INCLUDED
#define HERDER_H_INCLUDED

#include <SFML/Graphics.hpp>
#include <cstdlib>
#include "Level.h"
#include "Mob.h"

class Mob;

class Herder : public Mob
{
public:
    //Member functions.
    Herder(Level* level, int x, int y);
    void virtual GameCycle(sf::RenderWindow* App);
    void virtual Die();
    void Roar();
protected:
    float m_RoarCountdown;
    float m_RoarTime;
    float m_Speed;
    bool m_Roaring;
};

#endif // HERDER_H_INCLUDED
Run Code Online (Sandbox Code Playgroud)

确定它必须class Mob;是导致这种情况,我将其删除,但后来我得到以下错误,引用花括号打开的行:

error: expected class-name before '{' token
Run Code Online (Sandbox Code Playgroud)

这实际上是我最初添加前向声明的原因 …

c++ inheritance forward-declaration

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

OpenGL - 对象转换和VBO

所以我编写了一个使用顶点缓冲区对象渲染网格的程序,让我可以移动相机.我现在想要使对象独立于相机/视图移动.

但是,我不知道如何通过空间移动我的网格.谷歌搜索倾向于找到消息来源要么告诉我用glRotatef()等旋转对象,要么使用glRotatef()及其兄弟姐妹是一个坏主意,因为它们已被弃用.也许我没有使用正确的搜索词,但我找不到那么多看起来像是一个很好的起点.我看到对矩阵数学的模糊引用,但我不知道如何使用它以及采用什么方法.其他消息来源说我应该应用顶点着色器来转换对象.

我想我可以手动重建我的网格每一帧,但这似乎是一个可怕的想法(网格经常有超过50k三角形,我想至少有几十个),我真的不需要如果它们已经存储在VBO中,那么顶点会在我的内存中不断使用......对吗?

那么我该如何独立于全局空间来操作存储在VBO中的网格呢?我应该学习哪些资源来学习?

c++ opengl vbo sfml

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

Mersenne Twister种子没有效果

所以我有一个使用Mersenne Twister的自定义随机函数类(我使用的代码是从这个网站改编的).所有似乎都运行良好,直到我开始测试不同的种子(我通常使用42作为种子,以确保每次我运行我的程序,结果是相同的,所以我可以看到代码更改如何影响事物).

事实证明,无论我选择什么种子,代码每次都会生成完全相同的数字序列.显然,我做错了什么,但我不知道是什么.这是我的种子功能:

void Randomizer::Seed(unsigned long int Seed)
{
    int ii;
    x[0] = Seed & 0xffffffffUL;
    for (ii = 0; ii < N; ii++)
    {
        x[ii] = (1812433253UL * (x[ii - 1] ^ (x[ii - 1] >> 30)) + ii);
        x[ii] &= 0xffffffffUL;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的Rand()函数

unsigned long int Randomizer::Rand()
{
    unsigned long int Result;
    unsigned long int a;
    int ii;

    // Refill x if exhausted
    if (Next == N)
    {
        Next = 0;

        for (ii = 0; …
Run Code Online (Sandbox Code Playgroud)

c++ random mersenne-twister

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