OpenGL 로 렌 더 링 한 화려 한 안 드 로 이 드 애니메이션 라 이브 러 리

10181 단어 Android
이것 은 안 드 로 이 드 애니메이션 필터 라 이브 러 리 로 각종 멋 진 애니메이션 을 실현 할 수 있다.github 주소: ht t ps:// gith  u b.co m/g pl ib s/an dro id- ma gic-s ur fac e-view
1.설치
gradle:
dependencies {    compile 'com.gplibs:magic-surface-view:1.0.0'}

2.예시 효과
이 문 서 는 간단 한 설명 만 하고 구체 적 인 사용 방법 은 예시 항목 을 참고 하 십시오.(위의 github 주 소 는 예시 항목 을 찾 을 수 있 습 니 다.)
다음은 예시 효과 입 니 다.
애니메이션 시작 및 종료:
MacWindow 애니메이션 모방:
다른 몇 가지 예시 효 과 는 예시 항목 의 실행 을 다운로드 하여 볼 수 있다.
3.개술
하나의 MagicSurface View 는 하나의 MagicScene 만 동시에 렌 더 링 할 수 있 습 니 다.하나의 MagicScene 은 여러 개의 MagicSurface 를 포함 할 수 있 습 니 다.하나의 MagicSurface 는 하나의 View 또는 Bitmap 대상 에 대응 할 수 있 습 니 다.
필드 생 성 및 렌 더 링
//     Surface  MagicSurface surface = new MagicSurface(view) // view         View
        .setVisible(true)                //           (   true)
        .setShininess(64)                //          ,  64;        ,       ,        .
        .setGrid(30, 40)                 //          ,          ,      ;    30,30
        .setEnableBlend(true)            //                (     )
        .setEnableDepthTest(true)        //                                         (     )
        .setModelUpdater(modelUpdater)   //        ,                  ;     "5.       MagicSurfaceModelUpdater"
        .setMatrixUpdater(matrixUpdater) //        ,               ;     "6.       MagicSurfaceMatrixUpdater"
        .drawGrid(false);                //               false. (                    )//     MagicScene scene = new MagicSceneBuilder(mSurfaceView)
        .addSurfaces(surface)            //   Surface          : addSurfaces(surface, surface1, surface2)
        .ambientColor(0XFF222222)        //        ,    0XFFFFFFFF
        .addLights(light)                //       ,     PointLight  DirectionalLight;         : addLights(light, light1, light2)
        .setUpdater(sceneUpdater)        //        ,                ;     "4.       MagicSceneUpdater"
        .build();//   myMagicSurfaceView.render(scene);

모델 업데이트 기 MagicSurface ModelUpdater 애니메이션 원리:
MagicSurface ModelUpdater 원 리 는 상대 적 으로 번 거 롭 습 니 다.
렌 더 링 은 OpenGL 을 사용 합 니 다.매 직 서 피 스 대상 마다 Surface Model 이라는 Surface Model 은 openGl 이 그 릴 곡면 모델 을 포함 합 니 다.Surface Model 에는 OpenGL 을 그 릴 때 필요 한 요소,정점 좌표 집합,정점 색인 집합,법 적 벡터 집합 등 이 포함 되 어 있다.매 직 서 피 스 를 만 들 때 뷰 에 들 어가 면 비트 맵 을 텍 스 처 로 곡면 모형 에 연결 합 니 다.곡면 모형 의 생 성 및 무늬 귀속 과정 은 모두 이 라 이브 러 리 에서 자동 으로 완성 된다.
우리 가 할 수 있 는 것 은 Surface Model 의 정점 집합 은 r(행)*c(열)의 직사각형 격자 입 니 다.이 사각형 격자 에 있 는 각 점 의 속성 렌 더 링 효 과 를 수정 하면 해당 하 는 변화 가 있 습 니 다.속성 포함:
정점 좌표.격자 위의 한 점 의 정점 좌 표를 수정 한 후 이 점 에 연 결 된 무늬 도 이에 상응하는 변형 이 발생 할 수 있다
정점 색.격자 에 있 는 한 점 의 정점 색 을 수정 한 후 이 점 의 최종 색 은'정점 최종 색 계산 과정'처럼 변 합 니 다
정점 최종 색상 계산 과정 은:
정점 최종 색=원색*정점 색*장면 환경 빛 색+원색*정점 색*조명 색 원색 이 MagicSurface 를 구축 할 때 들 어 오 는 View 또는 Bitmap 에서 생 성 된 무늬 는 좌표 의 색 값 에 대응 합 니 다.정점 색 은 기본적으로 rgba(1,1,1,1)입 니 다.모델 업데이트 기 에서 수정 할 수 있 습 니 다.장면 환경 빛 색상 은 기본적으로 rgba(1,1,1,1)입 니 다.MagicSceneUpdater 에서 수정 할 수 있 습 니 다.조명 색상 이 MagicScene 을 구축 할 때 들 어 오 는 조명 대상 은 모델 이 정점 에 대응 하 는 빛 색상 값 에 집합 합 니 다.조명 색상 값 을 rgba(0,0,0,0)로 설정 하지 않 으 면;MagicSceneUpdater 에서 수정 할 수 있 습 니 다.
색상 곱 하기 알고리즘 은(그 중에서 r,g,b,a 는 모두 0~1 의 부동 소수점 으로 대응 합 니 다.×××색상 값 0~255)color 1(r1,g1,b1,a1)*color 2(r2,g2,b2,a2)=color 3(r1*r2,g1*g2,b1*b2,a1*a2)색상 더하기 알고리즘(그 중 r,g,b,a 는 모두 0~1 의 부동 소수점 으로 대응 합 니 다.×××색상 값 0~255)color 1(r1,g1,b1,a1)+color 2(r2,g2,b2,a2)=color 3(r1+r2,g1+g2,b1+b2,a1+a2)
필드 좌표(즉 OpenGL 좌표):
좌표 와 관련 된 애니메이션 작업 은 모두 장면 좌 표를 사용 하 는데 안 드 로 이 드 의 View 좌표계 와 무관 하 다.MagicSurface View 의 중심 은 바로 장면 좌표 원점(0,0,0)이다.x 축방향 오른쪽 y 축방향 상 z 축방향 화면 밖.MagicSurface 그리드 모델 각 점 좌표 z 축 은 기본적으로 0 MagicSurface View 와 MagicSurface 관련 점 장면 좌표 획득 방법 참조"5.모델 업데이트 기 MagicSurface 모델 업데이트"
오프셋 에 대하 여:
MagicSurface 에서 모델 업데이트 기와 매트릭스 업데이트 기 를 동시에 사용 할 때 두 개 는 하나의 응용 오프셋 만 있 을 수 있 습 니 다.그렇지 않 으 면 위치 에 오차 가 생 길 수 있 습 니 다.편 이 량 은 모델 업데이트 기와 매트릭스 업데이트 기 를 참고 하 는 것 을 구체 적 으로 설명 한다.
Updater 성능 최적화:
MagicSceneUpdater,MagicSurface ModelUpdater 및 MagicSurface MatrixUpdater 는 모두 MagicUpdater 의 하위 클래스 입 니 다.여러 개의 MagicUpdater 가 실 행 될 때 그룹 을 나 누 는 것 을 고려 할 수 있 습 니 다.MagicUpdater 는 그룹 매개 변 수 를 전송 할 수 있 는 구조 함수 와 set Group 방법 으로 그룹 을 나 눌 수 있 습 니 다.(setGroup 은 render 방법 을 호출 하기 전에 실행 해 야 합 니 다.그룹 을 나 누 지 않 으 면 혼자서 스 레 드 업 데 이 트 를 시작 합 니 다.계 산 량 이 적은 MagicUpdater 를 같은 그룹 으로 나 누 면 자원 을 절약 하고 성능 을 향상 시 킬 수 있 습 니 다.
4.필드 업데이트 기 MagicSceneUpdater
MagicSceneUpdater 는 장면 변 수 를 수정 합 니 다.장면 변 수 는 환경 빛 과 광원 을 포함한다.
호출 과정 은 willStart->didStart->(update[이 부분 은 notifyChanged 를 통 해 Updater stop 방법 을 호출 할 때 까지 순환 호출 을 촉발 합 니 다]->didStop
public class MySceneUpdater extends MagicSceneUpdater {    public MySceneUpdater(int group) {        super(group);
    }    //            (                )
    @Override
    protected void willStart(MagicScene scene) {
    }    //                            
    //           notifyChanged()            update         。
    @Override
    protected void didStart(MagicScene scene) {
    }    //    Updater   stop()                
    @Override
    protected void didStop(MagicScene scene) {
    }    //         
    @Override
    protected void update(MagicScene scene, Vec outAmbientColor) {        //      
        // outAmbientColor.setColor(...)

        //    0             
        // PointLight pl = scene.getLight(0);
        // pl.setColor(...);
        // pl.setPosition(...);

        //    1              
        // DirectionalLight dl = scene.getLight(1);
        // dl.setColor(...);
        // dl.setDirction(...);

        //                  MagicSurface  
        // scene.getSurface(index);
    }
}

5.모델 업데이트 기 MagicSurfaceModelUpdater
MagicSurface ModelUpdater 는 MagicSurface 격자 모델 의 정점 좌표 와 색상 값 을 수정 합 니 다.
호출 과정 은 willStart->didStart->(updateBegin->(updatePosition[격자 마다 옮 겨 다 니 기])->updateEnd[이 부분 은 notifyChanged 를 통 해 Updater stop 방법 을 호출 할 때 까지 순환 호출 을 촉발 합 니 다]->didStop
public class MyModelUpdater extends MagicSurfaceModelUpdater {    public MyModelUpdater() {
    }    //            (                )
    @Override
    protected void willStart(MagicSurface surface) {
    }    //                            
    //           notifyChanged()            update         。
    @Override
    protected void didStart(MagicSurface surface) {
    }    //     updater stop               
    @Override
    protected void didStop(MagicSurface surface) {
    }    //           
    @Override
    protected void updateBegin(MagicSurface surface) {
    }    /**     *        r , c                  outPos   outColor     * (                             openGL           )     *                                gc           *     * @param surface     * @param r       * @param c       * @param outPos      r c            ,                      * @param outColor      rgba(1,1,1,1),                      */
    @Override
    protected void updatePosition(MagicSurface surface, int r, int c, Vec outPos, Vec outColor) {
    }    //              
    @Override
    protected void updateEnd(MagicSurface surface) {        //               ,                                          
        // surface.getModel().updateModelNormal();

        //                     stop()     updater.
    }
    
}

MagicSurface ModelUpdater 관련 방법 설명:
Updater 수명 주기 내 에 다음 과 같은 방법 들 은 모두 효과적으로 호출 할 수 있다.
//    MagicSurfaceView  openGL       surface.getScene().getWidth();//    MagicSurfaceView  openGL       surface.getScene().getHeight();//    MagicSurfaceView    openGL          pos//    surface.getScene().getPosition(0.0f, 0.0f, pos);    MagicSurfaceView       //    surface.getScene().getPosition(0.0f, 1.0f, pos);    MagicSurfaceView       //    surface.getScene().getPosition(1.0f, 0.0f, pos);    MagicSurfaceView       //    surface.getScene().getPosition(1.0f, 1.0f, pos);    MagicSurfaceView       surface.getScene().getPosition(ratioX, ratioY, pos);//    MagicSurface  openGL       surface.getModel().getWidth();//    MagicSurface  openGL       surface.getModel().getHeight();//    MagicSurface        surface.getModel().getRowLineCount();//    MagicSurface        surface.getModel().getColLineCount();//    MagicSurface      r  c   openGL          pos//  :                   +       ;        SurfaceView      View MagicSurfaceView        .surface.getModel().getPosition(r, c, pos);//    MagicSurface      r  c   openGL          pos//  :                    surface.getModel().getPositionExcludeOffset(r, c, pos);

6.매트릭스 업데이트 기 MagicSurfaceMatrixUpdater
MagicSurface MatrixUpdater 는 MagicSurface 격자 모델 에 대해 각종 매트릭스 변환(크기 조정 회전 이동)을 진행 합 니 다.
호출 과정 은 willStart->didStart->(updateMatrix[이 부분 은 notifyChanged 를 통 해 Updater stop 방법 을 호출 할 때 까지 순환 호출 을 촉발 합 니 다]->didStop
public class MyMatrixUpdater extends MagicSurfaceMatrixUpdater {    public MyMatrixUpdater(int gorup) {        super(group);
    }    //            (                )
    @Override
    protected void willStart(MagicSurface surface) {
    }    //         ;                   
    //           notifyChanged()            update         。
    @Override
    protected void didStart(MagicSurface surface) {
    }    //     updater stop               
    @Override
    protected void didStop(MagicSurface surface) {
    }    /**     *          * @param surface     MagicSurface       * @param offset offse               ,       offset    model               *     *                   View    MagicSurface       *               View        MagicSurfaceView                        offset。     *     * @param matrix        */
    @Override
    protected void updateMatrix(MagicSurface surface, Vec offset, float[] matrix) {        //   matrix
        reset(matrix);        //    
        scale(matrix, xScale, yScale, zScale);        //         
        translate(matrix, x + offset.x(), y + offset.y(), z + offset.z());        //   
        // translate(matrix, x, y, z);

        //   axis     angle 。
        rotate(matrix, axis, angle);        //  :                      。
    }
}

좋은 웹페이지 즐겨찾기