Save
Saving
  • Zero

    0_1564880258942_box2d_logo.png


    下载文件并进入目录

    git clone -b v2.3.1 https://github.com/erincatto/Box2D.git
    cd Box2D
    

    整理下文件:

    rm -rf ./Contributions
    mv ./Box2D ./tmp
    mv ./tmp/Box2D ./Box2D
    rm -rf ./tmp
    mkdir Lib
    mkdir Include
    

    添加CMakeLists.txt,内容如下:

    cmake_minimum_required(VERSION 2.6)
    
    project(Box2D)
    
    # 若果要改成动态编译,将下面OFF 和 ON的位置对调
    set(BOX2D_BUILD_SHARED OFF)
    set(BOX2D_BUILD_STATIC ON)
    
    
    set(BOX2D_VERSION 2.3.0)
    set(LIB_INSTALL_DIR lib${LIB_SUFFIX})
    
    add_subdirectory(Box2D)
    

    编译安装

    cmake .
    make
    mv ./Box2D/libBox2D.a ./Lib/libBox2D.a
    mv ./Box2D/Box2D.h ./Include/Box2D.h
    mv ./Box2D/Collision ./Include/Collision
    mv ./Box2D/Common ./Include/Common
    mv ./Box2D/Dynamics ./Include/Dynamics
    mv ./Box2D/Rope ./Include/Rope
    rm -rf Box2D
    rm -rf ./cmake*
    rm -rf ./CMake*
    rm -rf Makefile
    

    头文件在Include目录中,静态库在Lib目录中。


    如果你懒得配置的话,这里有我配置好的,直接运行脚本就可以自己编译了:
    https://github.com/guaik/Box2DInstaller.git

    posted in GuaiK实验室 read more
  • Zero

    向量V是通过碰撞检测时计算出的圆心C距离AABB最近位置P的距离,由P-C得到。
    https://bbs.guaik.org/topic/104/碰撞检测算法-圆-aabb


    图中画出了左右方向的碰撞示意,还有上下碰撞没画出来,如果左上角顶点为(0, 0),右下角坐标为800, 600,则当圆在AABB上方的时候V的方向向量为(0,1),因为P点的Y坐标肯定大于圆心Y坐标。同理,当圆在AABB下方的时候方向向量为(0, -1)因为P点的Y坐标小于圆心Y坐标。
    定义方向向量:UP(0, 1) RIGHT(1, 0) DOWN(0, -1) LEFT(-1, 0)
    当球碰撞AABB上边的时候实际计算出的碰撞方向:
    (0, 1) · (0, 1) = 1 // 对应的是UP

    当球碰撞AABB下边的时候实际计算出的碰撞方向:
    (0, -1) · (0, -1) = 1 // 对应的是DOWN

    总结:
    撞击左边:V(1, 0),方向RIGHT
    撞击右边:V(-1, 0),方向LEFT
    撞击上边:V(0, 1),方向UP
    撞击下边:V(0, -1),方向DOWN


    0_1564583835395_WechatIMG161.jpeg

    posted in GuaiK实验室 read more
  • Zero

    先检测当前编译系统是否支持c++11,如果支持的话将"-std=c++11"加入编译参数中。


    include(CheckCXXCompilerFlag)
    CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
    CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
    if(COMPILER_SUPPORTS_CXX11)
            set(CMAKE_CXX_FLAGS "-std=c++11")
    elseif(COMPILER_SUPPORTS_CXX0X)
            set(CMAKE_CXX_FLAGS "-std=c++0x")
    else()
         message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
    endif()
    
    set(CMAKE_CXX_COMPILER "g++")
    set(CMAKE_BUILD_TYPE "Debug")
    set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb -m64 ${CMAKE_CXX_FLAGS}")
    set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall -m64 ${CMAKE_CXX_FLAGS}")
    

    这可以解决一些类似这样的问题:

    • error: no member named ‘tuple’ in namespace ‘std’
    • error: no member named ‘vector’ in namespace ‘std’

    posted in GuaiK实验室 read more
  • Zero

    0_1564473077975_1564473064137.jpg

    先简单介绍下,左边是个圆,右边是个矩形(AABB)箱。AABB-AABB和圆-AABB都是常用的碰撞检测方法,这种算法比较简单高效,但是精度不高,因为碰撞箱与被包裹物体很难完全吻合,所以会导致实际还没碰撞的时候就检测到碰撞。


    圆-AABB碰撞检测原理:

    找到矩形与圆最近的点vP,vC - vP,如果小于或等于0则发生碰撞。


    字母上方带一横的表示向量,我会在字母前用一个小写的v来表示向量。

    坐标使用左上角为原点(0.0),还有一些参数没在图中标记出。
    vec2:表示有x和y向量的分量(两个分量)。

    圆的坐标原点为:vCirclePos [vec2类型]
    矩形坐标原点:vRectanglePos [vec2类型]。
    矩形向量:vRectangle {vec2类型}


    参数介绍:

    • radius:圆的半径
    • vC:圆心,可以通过pCircle + radius计算出
    • half_width:矩形宽度的一半,vRectangle.x / 2
    • half_height:矩形高度的一半, vRectangle.y / 2
    • clamped.x:限制后的宽度
    • clamped.y: 限制后的高度
    • vB :矩形中心,vRectanglePos.x + half_width, vRectanglePos.y + half_height
    • vD:圆心与矩形中心的向量差,vD = vC - vB
    • vP:距离圆最近的点

    其中clamped.x和clamped.y(clamped向量)是通过限制函数计算出来的,限制函数可以将vD限制在了矩形的4条边上,这样可以计算出矩形边上的哪个点与当前的圆是最近的。

    常见的限制函数算法:

    float clamp(float value, float min, float max){
        return std::max(min, std::min(max, value));
    }
    

    圆-AABB碰撞检测伪代码:

    // 计算出圆心位置和矩形中心位置
    vC = pCircle + radius;
    half-width = vRectangle.x; / 2;   // 矩形半宽
    half-height = vRectangle.y; / 2; // 矩形半高
    
    
    // 计算圆心与矩形中心的向量差
    vD = vC - vB;
    // 通过限制函数计算出圆心到矩形最近点的向量差
    // 如果以矩形中心为原点,左上角的向量就是(-half_width, -half_height);
    // 同理右下角的向量就是(half_width, half_height);
    // 这样可以把vD向量控制在由矩形中心到矩形边的长度,所以vP肯定会落在矩形边上
    vD.x = clamp(vD.x,  -half_width, half_width);
    vD.y = clamp(vD.y, -half_height, half_height);
    // 使用矩形中心 + vD,得到距离最近的点vP
    vP = vRectangle + vD;
    // 最后计算出圆心到距离最近点vP的距离是否小于等于圆的半径radius
    // 如果小于等于圆的半径则发生圆-AABB发生碰撞
    difference = vP - vC;
    if (length(difference) <= radius){
        // 碰撞处理
    }
    

    posted in GuaiK实验室 read more
  • Zero

    先给服务器配置好磁盘整列,我选择了4块硬盘做的Raid1+0


    下载阵列驱动程序(B120i)
    CentOS 7.2
    http://downloads.hpe.com/pub/softlib2/software1/pubsw-linux/p1903785255/v115075/hpvsa-1.2.14-113.rhel7u2.x86_64.dd.gz
    CentOS 7.3
    http://downloads.hpe.com/pub/softlib2/software1/pubsw-linux/p1903785255/v123365/hpvsa-1.2.16-102.rhel7u3.x86_64.dd.gz
    或者在搜索页选择与CentOS版本匹配的驱动程序
    https://support.hpe.com/hpesc/public/km/search#q=b120i centos&t=All&sort=relevancy&f:@source=[cdp-km-software-pro-h9-v1]


    使用Linux系统dd指令将下载后的驱动程序写入U盘中

    • 将U盘插入Linux系统中
    • 使用fdisk -l查看磁盘信息,发现U盘是/dev/sda
    • 然后将驱动写入U盘中
    dd if=hpvsa-1.2.16-102.rhel7u3.x86_64.dd of=/dev/sda
    

    在CentOS安装选择界面按ESC,输入下列代码后回车

    linux modprobe.blacklist=ahci inst.dd
    

    启动后选择驱动盘进行安装

    • 按r刷新直到显示驱动挂在目录
    • 输入数字进行驱动选择
    • 按c继续,进行驱动安装
    • 移除驱动U盘
    • 按c继续,启动安装程序

    posted in GuaiK机房 read more
  • Zero

    很多网站有提供在线运行java程序的功能,但是在Mac下我测试了Chrome和Safari浏览器都不行。点击运行按钮后会下载一个.jnlp的文件,用javaws命令直接运行就OK了。

    /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/javaws XXX.jnlp
    

    posted in GuaiK机房 read more
  • Zero

    固件下载地址:
    https://support.hpe.com/hpsc/swd/public/detail?swItemId=MTX_3830eb5b87574d6cb463c44994

    如果地址不可用的话可自己搜索下:
    1、进入搜索页面
    https://support.hpe.com/hpesc/public/km/search
    2、搜索关键词:
    “HPE ProLiant MicroServer Gen8 Server”
    3、内容区上方选择:
    “DRIVERS AND SOFTWARE”
    4、左边栏筛选:

    • Firmware
    • Lights-Out Management

    然后我选择了:
    “* RECOMMENDED * REMOVED Online ROM Flash Component for Linux - HPE Integrated Lights-Out 4”
    点击后进入介绍页面,在介绍页面点击“Obtain software”按钮进入下载页面。

    在下载页面有exe和rpm两个版本,随便选择一个版本下载后进行解压,在里边找到“ilo4_xxx.bin”文件,这个就是ILO的固件升级程序。

    posted in GuaiK机房 read more
  • Zero

    错误信息:

    yum update
    Loaded plugins: fastestmirror
    base                                                                                                                                                  | 3.6 kB  00:00:00
    
    
     One of the configured repositories failed (Unknown),
     and yum doesn't have enough cached data to continue. At this point the only
     safe thing yum can do is fail. There are a few ways to work "fix" this:
    
         1. Contact the upstream for the repository and get them to fix the problem.
    
         2. Reconfigure the baseurl/etc. for the repository, to point to a working
            upstream. This is most often useful if you are using a newer
            distribution release than is supported by the repository (and the
            packages for the previous distribution release still work).
    
         3. Run the command with the repository temporarily disabled
                yum --disablerepo=<repoid> ...
    
         4. Disable the repository permanently, so yum won't use it by default. Yum
            will then just ignore the repository until you permanently enable it
            again or use --enablerepo for temporary usage:
    
                yum-config-manager --disable <repoid>
            or
                subscription-manager repos --disable=<repoid>
    
         5. Configure the failing repository to be skipped, if it is unavailable.
            Note that yum will try to contact the repo. when it runs most commands,
            so will have to try and fail each time (and thus. yum will be be much
            slower). If it is a very temporary problem though, this is often a nice
            compromise:
    
                yum-config-manager --save --setopt=<repoid>.skip_if_unavailable=true
    
    Cannot retrieve metalink for repository: epel/x86_64. Please verify its path and try again
    

    解决方案

    # 1、删除epel.repo
    rm -rf /etc/yum.repos.d/epel.repo
    rm -rf /etc/yum.repos.d/epel-testing.repo
    
    # 2、检查DNS
    vi /etc/resolv.conf
    # 添加: nameserver 8.8.8.8
    # 重启网络服务
    systemctl restart network
    
    # 测试是否修复
    yum update
    

    posted in GuaiK机房 read more
  • Zero

    hostnamectl set-hostname guaik.org
    
    vi /etc/hosts
    # 在127.0.0.1后面加上[hostname]
    # 如果有外网IP的话也需要修改
    127.0.0.1      localhost.localdomain localhost
    xx.xx.xx.xx    guaik.org # 外网IP
    
    # 检查修改
    hostname -f
    cat /etc/hosts
    

    posted in GuaiK机房 read more
  • Zero

    我通常使用VSCode+CMake开发C++的程序,但是即使我在CMakeLists.txt中配置了Include的路径VSCode在#include时不但不自动补全路径还显示红色的波浪下划线。为了让VSCode能够知道Include的路径还需要针对当前工程配置.vscode/c_cpp_properties.json文件,可以通过shift+command+P然后选择C/C++: Edit Configurations(JSON)生成该文件。
    然后配置c_cpp_properties.json中的includePath字段:

    {
        "configurations": [
            {
                "name": "Mac",
                "includePath": [
                    "${workspaceFolder}/**",
                    "${workspaceFolder}/glm",
                    "${workspaceFolder}/glad",
                ],
                "defines": [],
                "macFrameworkPath": [],
                "compilerPath": "/usr/local/bin/gcc-8",
                "cStandard": "c11",
                "cppStandard": "c++17",
                "intelliSenseMode": "clang-x64"
            }
        ],
        "version": 4
    }
    

    配置后导入头文件:(例如demo.cpp在根目录下)

    // This is demo.cpp
    #include "glad/include/glad.h"
    #include "glm/glm.hpp"
    

    这时候就能够智能补全,红色波浪下划线也消失了。

    posted in GuaiK实验室 read more